Wie werden String-Vervollständigungen an stdout ausgegeben?

15

Einige der gitBefehle haben viele Optionen, und es wäre oft nützlich, sie nach der gewünschten zu durchsuchen. Ich habe nur nach der Option gesucht, die die TABBreite steuert git-gui, aber es gibt ungefähr 200 Vervollständigungen für git config. Eine naheliegende Problemumgehung besteht darin, alle Vervollständigungen in einen Editor zu kopieren und sie zu durchsuchen, aber ich würde es lieber tun

[something] | grep tab

Es gibt keine manoder infoSeiten für compgen, help compgenerklärt nicht einmal die eigenen Optionen, und es gibt keine automatische Vervollständigung für compgen(wie ist das für Ironie?).

PS: compgen -Afunktioniert nicht.

PPS: Dies ist keine Frage zu git-gui- Die Lösung für die Frage nach der Registerbreite war an anderer Stelle.

PPPS: Hier geht es nicht um die automatische Vervollständigung von Befehlen, sondern nur um Befehlsparameter .

l0b0
quelle
Dies ist sehr ähnlich zu Wie wird die Ausgabe von "tab complete" weitergeleitet? , aber die akzeptierte Antwort gab es speziell zum Vervollständigen von Befehlen, keine Argumente
Michael Mrozek

Antworten:

10

Sie können die folgende Funktion verwenden, mit der sudodie Vervollständigungsliste auf dieselbe Weise automatisch erstellt wird:

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 ''

wo _command_offsetist in Bash-Vervollständigung (Paket) definiert.

HINWEIS: Die Funktion muss in einer interaktiven Shell ausgeführt werden (dh, wenn sie sich in einer Datei befindet, muss die Datei aus einer Quelle stammen, anstatt nur ausgeführt zu werden.) Oder die erforderlichen Abschlussregeln / -funktionen werden nicht definiert.

PS. compgen -AFunktioniert nur für eingebaute Aktionen. Was Sie hätten versuchen sollen (aber auch nicht), ist compgen -F(oder tatsächlich compgen -o bashdefault -o default -o nospace -F _git). Der Grund, warum dies nicht funktioniert (und doc für integrierte bash-Befehle, einschließlich compgen / complete), ist in bash (1) zu finden .

yuyichao
quelle
@ l0b0 klappt hoffentlich in allen fällen.
Yuyichao
Hervorragend, es funktioniert! Ich habe ein paar kleinere Änderungen vorgenommen und jetzt ist es endgültig in meinen .bash_aliases . Vielleicht möchten Sie beschneiden, damit nur noch die Lösung übrig ist, aber es besteht kein Zweifel, dass Sie das Kopfgeld erhalten. Ich werde meine Diskussionskommentare entfernen, da sie nicht mehr relevant sind.
l0b0
1
Ich habe festgestellt, dass die Verwendung dieser Option in der interaktiven Shell die bereits vorhandene Tab-Vervollständigung zerstören kann. Indem Sie jede der Variablen lokal für die Funktion festlegen, wird das Problem behoben. (zB local COMP_LINE="$*")
AL Flanagan
@ALFlanagan Guter Punkt. Aktualisiert.
Yuyichao