Cet article est la suite de: L’auto complétion programmable en bash: partie 5.

Un motif général et basique

Nous avons écrit un petit programme pour tester, puis nous avons écrit un script d’auto-complétion très simple. Reprenons notre jeu de rôle: nous avons un programme mytool qui attend une des trois commandes suivantes: new, compile ou test. On va ajouter ceci: la commande new peut prendre l’option --without-test et la commande compile peut prendre l’option --verbose. Ça reste encore très simple, mais on ne peut déjà plus se servir uniquement de la fonction complete, vue la dernière fois.

Voyons donc le motif général utilisé par beaucoup de scripts d’auto-complétion:

_mytool()
{
    local current=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen -W "new compile test" -- $current) )
}
complete -F _mytool mytool

Le script ci-dessus fait exactement la même chose que notre simple script de la dernière fois, qui était le suivant:

complete -W "new compile test" mytool

Mais il le fait d’une manière plus compliquée. En effet, pourquoi faire simple… Les explications viendront plus tard.

En fait, pour aller plus loin, il est important de comprendre le rôle des variables COMP_WORDS, COMP_CWORD et COMPREPLY. Pour ça, on va modifier notre script, et chercher à comprendre ce que représente COMPREPLY:

_mytool()
{
    COMPREPLY=( this is some replacement )
}
complete -F _mytool mytool

Pour qu’il soit pris en compte tout de suite, il faut le sourcer:

$ source /etc/bash_completion.d/mytool

Alors, que fait-il ? Si je tapes mytool foo bar[TAB], voici ce que le script sort:

$ mytool foo bar[TAB]
is           replacement  some         this   

COMPREPLY accepte un tableau de chaînes, qui sont les suggestions que nous renvoit l’auto-complétion. On note au passage que ces suggestions sont triées alphabétiquement.

Modifions à nouveau notre script:

_mytool()
{
    COMPREPLY=( replacement )
}
complete -F _mytool mytool

Cette fois, COMPREPLY représente un tableau d’un seul élément. N’oubliez pas de sourcer le script avant de le tester:

$ mytool foo bar[TAB]

devient:

$ mytool foo replacement

Vous devriez maintenant avoir bien compris à quoi sert la variable COMPREPLY.

La prochaine fois, on regardera en détail les variables COMP_WORDS et COMP_CWORD.

À demain.