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.]

Était-ce utile?

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

  1. Via complete -p on trouve complete -o bashdefault -o default -o nospace -F _git git. Nous nous souvenons "_git" pour plus tard.
  2. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top