L'auto-complétion programmable en Bash - partie 6
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 mytoolLe 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" mytoolMais 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 mytoolPour 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 mytoolCette 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.