Je commence donc à apprendre les scripts de complétion bash, et j'ai commencé à travailler sur un pour un outil que j'utilise tout le temps. Tout d'abord, j'ai construit le scripts en utilisant une liste d'options définie :
_zf_comp()
{
local cur prev actions
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
actions="change configure create disable enable show"
COMPREPLY=($(compgen -W "${actions}" -- ${cur}))
return 0
}
complete -F _zf_comp zf
Cela fonctionne bien. Ensuite, j'ai décidé de créer dynamiquement la liste des actions disponibles. J'ai mis en place la commande suivante :
zf | grep "Providers and their actions:" -A 100 | grep -P "^\s*\033\[36m\s*zf" | awk '{gsub(/[[:space:]]*/, "", $3); print $3}' | sort | uniq | awk '{sub("\-", "\\-", $1); print $1}' | tr \\n " " | sed 's/^ *\(.*\) *$/\1/'
Qui fait essentiellement ce qui suit :
- Saisit tout le texte de la commande "zf" après "Les fournisseurs et leurs actions :".
- Saisit toutes les lignes qui commencent par "zf" (j'ai dû faire un peu d'imagination ici parce que la commande ZF imprime en couleur).
- Prenez la deuxième partie de la commande et supprimez tous les espaces (la partie espaces n'est probablement plus nécessaire).
- Trier la liste
- Débarrassez-vous de tous les doublons
- Tirets d'échappement (j'ai ajouté ceci en essayant de déboguer le problème - probablement pas nécessaire)
- Coupez toutes les nouvelles lignes
- Supprimez tous les espaces de début et de fin
La commande ci-dessus produit :
$ zf | grep "Providers and their actions:" -A 100 | grep -P "^\s*\033\[36m\s*zf" | awk '{gsub(/[[:space:]]*/, "", $3); print $3}' | sort | uniq | awk '{sub("\-", "\\-", $1); print $1}' | tr \\n " " | sed 's/^ *\(.*\) *$/\1/'
change configure create disable enable show
$
Il me semble donc qu'il produit exactement la même chaîne que celle que j'avais dans mon script original. Mais quand je le fais :
_zf_comp()
{
local cur prev actions
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
actions=`zf | grep "Providers and their actions:" -A 100 | grep -P "^\s*\033\[36m\s*zf" | awk '{gsub(/[[:space:]]*/, "", $3); print $3}' | sort | uniq | awk '{sub("\-", "\\-", $1); print $1}' | tr \\n " " | sed 's/^ *\(.*\) *$/\1/'`
COMPREPLY=($(compgen -W "${actions}" -- ${cur}))
return 0
}
complete -F _zf_comp zf
Mon autocomplétion commence à faire des siennes. Tout d'abord, il n'autocomplète rien qui contienne un "n", et ensuite, lorsqu'il autocomplète ("zf create" par exemple), il ne me laisse pas revenir en arrière sur la commande terminée.
La première question qui me laisse complètement perplexe. Pour le second, je pense qu'il s'agit des caractères d'échappement du texte coloré.
Des idées ? Cela me rend fou !