Accès à complétions de bash pour les commandes par programme spécifique
-
29-09-2019 - |
Question
Je suis en train d'écrire une petite application de lancement de commande, et souhaite utiliser les complétions onglet bash dans mon propre système d'achèvement. Je suis en mesure d'obtenir une liste des achèvements pour les commandes générales en utilisant compgen -abck
.
Cependant, je voudrais aussi que pour obtenir les achèvements pour les commandes spécifiques: par exemple, la git p
d'entrée doit afficher fin pour les commandes de git.
Est-il possible que je peux utiliser compgen
pour le faire? Sinon, y at-il d'autres moyens que je peux obtenir une liste des complétions programme?
[EDIT: Pour clarifier les choses, je ne cherche pas à fournir à la fin bash - mon application est un lanceur de commande GUI. Je voudrais simplement aux complétions existants de l'utilisation bash dans ma propre application.]
La solution
Je ne sais pas vraiment comment cela fonctionne, mais le gestionnaire de fenêtres awesome utilise le code suivant pour Lua avoir accès au résultat de la fin de bash:
https://github.com/awesomeWM/ awesome / blob / maître / lib / terrible / completion.lua # L119
- Via
complete -p
on trouvecomplete -o bashdefault -o default -o nospace -F _git git
. Nous nous souvenons "_git" pour plus tard. - La longueur de "l git" est 5, nous avons donc mis COMP_COUNT = 6. Nous terminons le premier argument de "connard", donc COMP_CWORD = 1.
Tous ensemble nous utilisons le script suivant:
__print_completions() {
printf '%s\n' "${COMPREPLY[@]}"
}
# load bash-completion functions
source /etc/bash_completion
# load git's completion function
_completion_loader git
COMP_WORDS=(git l)
COMP_LINE='git l'
COMP_POINT=6
COMP_CWORD=1
_git
__print_completions
Sortie: "log"
Autres conseils
Jetez un oeil à l'administration Debian Une introduction à la fin de bash - il est assez facile à comprendre - par ailleurs, il a aussi un deuxième partie
Vérifiez dans le répertoire /etc/bash_completion.d/
. C'est là que les différents scripts d'achèvement de commande restent.
Voici un exemple simple, mais travaillant en bash:
function foo_completion()
{
local currentWord=${COMP_WORDS[COMP_CWORD]}
local completionList=""
case "${COMP_CWORD}" in
"1")
completionList="command1 command2 command3";
;;
"2")
completionList="param1 param2 param3";
;;
esac
COMPREPLY=( $( compgen -W "${completionList}" -- ${currentWord} ) )
}
complete -F foo_completion foo
Avec ce genre de code, vous aurez commandN terminé lorsque vous tapez "foo c" + tab et paramN terminé lorsque vous tapez "foo command1 p" + onglet
Vous pouvez calculer la liste d'achèvement de l'aide de la commande.
MY2C
Je piraté jusqu'à ce script un certain temps ce qui vous donne assez précis Bash Man page Completion Je sais que d'autres personnes ont fait des choses similaires avec l'analyse syntaxique sortie option --help
.