Exemple de définition de complétion simple

Bruno Bonfils asyd at asyd.net
Mon Aug 7 08:38:44 CEST 2006


Bonjour à tous,

voici un rapide tutorial pouvant vous être utile, enfin je l'espère.

Pour définir une complétion (simple) d'un programme, il n'est pas
obligatoire de créer une fonction (_commande). Il est possible de la
définir via la commande compdef, via la syntaxe suivante : (l'une des
nombreuses possibles)

compdef _widget commande [commande ..]

On peut donc par exemple définir la complétion pour l'outil mtr :

compdef _hosts mtr

Il est donc possible d'utiliser le widget _wanted pour définir sa propre
complétion. (cf doc section 20.6)

Un petit exemple de définition d'une complétion très simple.  Soit les
outils debian a2* (a2enmod, a2dismod, a2enmod, a2dismod) qui attendent
un unique argument correspondant soit à un site disponible
(/etc/apache2/sites-available) soit à un site activé
(/etc/apache2/sites-enabled), pareil pour les modules.

Commencons par créer la liste des sites et des modules :

--%<--
   mods_enabled=(/etc/apache2/mods-enabled/*)
--%<--

mods_enabled contient ici une liste qui ressemble à :

% echo $mods_enabled
/etc/apache2/mods-enabled/actions.load
/etc/apache2/mods-enabled/cgi.load
/etc/apache2/mods-enabled/rewrite.load

Il s'agit donc de mettre en forme les données pour n'obtenir qu'une
liste du type (actions cgi rewrite)

--%<--
   mods_enabled=${(u)mods_enabled:t:r}
--%<--

mods_enabled:t      - équivalent à basename (doc section 14.1.4)
mods_enabled  :r    - supprime l'extension (doc section 14.1.4)
${(u)mods_enabled}  - suppression des doublons (dans le cas d'un module
                      avec un fichier .load et un fichier .conf) (section
                      14.3.1)

On dispose maintenant de notre liste, il ne nous reste plus qu'à
définir la complétion

--%<--
compdef "_wanted mod expl 'Apache 2 module' compadd $mods_enabled"
a2dismod
--%<--

Ce qui peut donner quelque chose du genre :

--8<--
apache2_comp () {
   typeset mods_available mods_enabled sites_available sites_enabled

   mods_available=(/etc/apache2/mods-available/*)
   sites_available=(/etc/apache2/sites-available/*)

   mods_enabled=(/etc/apache2/mods-enabled/*)
   sites_enabled=(/etc/apache2/sites-enabled/*)

   mods_available=${(u)mods_available:t:r}
   mods_enabled=${(u)mods_enabled:t:r}

   sites_available=${(u)sites_available:t}
   sites_enabled=${(u)sites_enabled:t}

   compdef "_wanted site expl 'Apache 2 site' compadd $sites_available"
a2ensite
   compdef "_wanted site expl 'Apache 2 site' compadd $sites_enabled"
a2dissite

   compdef "_wanted mod expl 'Apache 2 module' compadd $mods_available"
a2enmod
   compdef "_wanted mod expl 'Apache 2 module' compadd $mods_enabled"
a2dismod
}

[ -d /etc/apache2 ] && apache2_comp
--8<--

Retrouver la fonction sur : 

http://svn.asyd.net/svn/zsh/trunk/rc.os/Debian.zsh


-- 
http://asyd.net/home/   - Home Page
http://guses.org/home/  - French Speaking Solaris User Group


More information about the Shell mailing list