Pour enregistrer une "spec de complétion" on utilise la commande complete
:
complete -W "LISTE_DE_MOTS" -- MA_COMMANDE_A_COMPLETER complete -F _MA_FONCTION -- MA_COMMANDE_A_COMPLETER
Une fois la spec enregistrée, lorsque l'utilisateur utilise le mécanisme de complétion (avec la touche ), une liste mot lui est proposé pour compléter sa ligne de commande.
Si la spec de complétion indique que l'on utilise une fonction, alors a chaque fois que l'utilisateur utilise le mécanisme de complétion (avec la touche ), la fonction _MA_FONCTION est appelée pour déterminer quels sont les mots à proposer à l'utilisateur.
La fonction est chargé de déterminer en fonction du contexte la liste des mots à proposer à l'utilisateur pour compléter sa ligne de commande.
Il est d'usage de nommer cette fonction avec un _ (underscore) comme préfixe.
Dans la fonction, on dispose de 3 variables d'environnement pour implémenter la logique de complétion :
La fonction est appelée avec ces 3 paramètres :
Pour des usages complexes, notamment avec une fonction, il est pratique d'utiliser la commande compgen
:
compgen -W "LISTE_DE_MOTS" -- MOT_A_MATCHER
Cette commande permet par exemple de filtrer une liste de mots. Dans notre exemple, elle retourne tous les mots de la LISTE_DE_MOTS qui match le MOT_A_MATCHER au sens habituel du mécanisme de complétion.
Dans cet exemple, la commande mon_autre_commande
sera complétée avec les mots "foo bar baz".
complete -W "foo bar baz" -- mon_autre_commande
Dans cet exemple, la commande ma_commande
sera complétée par un premier niveau de mots : "foo bar baz".
Puis un second niveau de complétion sera proposé lorsque le premier mot sera complété : la commande ma_commande bar
sera complété par les mots "-o -i -b toto".
_ma_commande() { COMPREPLY=(); # Mot en cours d'écriture local word="${COMP_WORDS[COMP_CWORD]}"; local completions if [ "$COMP_CWORD" -eq 1 ] then # En cours d'écriture du premier mot après la commande completions="foo bar baz" COMPREPLY=($(compgen -W "$completions" -- "$word")) else # Le premier mot est déjà écrit local firstWord="${COMP_WORDS[1]}" case "${COMP_WORDS[1]}" in foo) completions="-a -b --test" ;; bar) completions="-o -i -b toto" ;; baz) completions="--name -a" ;; esac fi # On stocke les mots à proposer à l'utilisateur dans le tableau COMPREPLY COMPREPLY=($(compgen -W "$completions" -- "$word")) } complete -F _ma_commande -- ma_commande