Comment produire des compléments de chaîne sur stdout?

15

Certaines gitcommandes ont de nombreuses options, et il serait souvent utile de les rechercher pour celle dont j'ai besoin - je cherchais simplement l'option qui contrôle la TABlargeur git-gui, mais il y a environ 200 finitions pour git config. Une solution de contournement évidente consiste à copier toutes les finitions dans un éditeur et à les rechercher, mais je préfère faire

[something] | grep tab

Il n'y a pas de manou de infopages pour compgen, help compgenn'explique même pas ses propres options, et il n'y a pas de saisie automatique pour compgen(comment est-ce pour l'ironie?).

PS: compgen -Ane fonctionne pas.

PPS: Ce n'est pas une question sur git-gui- La solution à la question de la largeur de tabulation était ailleurs.

PPPS: Il ne s'agit pas de commandes de saisie semi -automatique, mais uniquement de paramètres de commande .

l0b0
la source
Ceci est très similaire à Comment diriger la sortie de "tabulation terminée"? , mais la réponse acceptée était spécifiquement pour compléter les commandes, pas les arguments
Michael Mrozek

Réponses:

10

Vous pouvez utiliser la fonction suivante, qui utilise de la même manière que l' sudoauto-complétion génère la liste d'achèvement:

comp() {
    local COMP_LINE="$*"
    local COMP_WORDS=("$@")
    local COMP_CWORD=${#COMP_WORDS[@]}
    ((COMP_CWORD--))
    local COMP_POINT=${#COMP_LINE}
    local COMP_WORDBREAKS='"'"'><=;|&(:"
    # Don't really thing any real autocompletion script will rely on
    # the following 2 vars, but on principle they could ~~~  LOL.
    local COMP_TYPE=9
    local COMP_KEY=9
    _command_offset 0
    echo ${COMPREPLY[@]}
}
comp git config ''

_command_offsetest défini dans bash-compléte (package).

REMARQUE: la fonction doit être exécutée dans un shell interactif (c'est-à-dire si elle se trouve dans un fichier, le fichier doit être sourced au lieu d'être simplement exécuté.) Ou les règles / fonctions de complétion nécessaires ne seront pas définies.

PS. compgen -Ane fonctionne que pour les actions intégrées, ce que vous auriez dû essayer (mais ne fonctionne pas non plus) est compgen -F(ou en fait compgen -o bashdefault -o default -o nospace -F _git). La raison pour laquelle cela ne fonctionne pas (et la doc pour les commandes intégrées bash, y compris compgen / complete) peut être trouvée dans bash (1) .

yuyichao
la source
@ l0b0 fonctionne avec optimisme dans tous les cas.
yuyichao
Excellent, ça marche! J'ai fait quelques ajustements mineurs et maintenant c'est dans mes .bash_aliases pour de bon. Vous voudrez peut-être tailler pour ne laisser que la solution, mais il ne fait aucun doute que vous obtenez la prime. Je supprimerai mes commentaires de discussion car ils ne sont plus pertinents.
l0b0
1
J'ai trouvé que l'utilisation de cela dans le shell interactif peut détruire l'achèvement de tabulation déjà en place. Rendre chacune des variables locale à la fonction résout ce problème. (par exemple local COMP_LINE="$*")
AL Flanagan
@ALFlanagan Bon point. Mis à jour.
yuyichao