Ceci est une ancienne révision du document !
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 <TAB>
), 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 <TAB>
), 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.
_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 complete -W "foo bar baz" -- mon_autre_commande