Wie lege ich die Zsh-Autovervollständigungsregeln für das zweite Argument (der Funktion) gemäß den Regeln eines vorhandenen Befehls fest?

Wie lege ich die Zsh-Autovervollständigungsregeln für das zweite Argument (der Funktion) gemäß den Regeln eines vorhandenen Befehls fest?

Ich habeeine benutzerdefinierte Zsh-Funktiong:

function g() {
  # Handle arguments [...]
}

Darin behandle ich kurze Argumente, die Git-Befehle ausführen. Zum Beispiel:

g ls # Executes git ls-files ...
g g  # Executes git grep ...

Ich muss in der Lage sein, die Autovervollständigungsregeln auf die Git-Regeln für die kurzen Argumente einzustellen, bin mir aber nicht sicher, wie das geht.

Beispielsweise muss ich g ls <TAB>die Regeln mit der Tabulatortaste vervollständigen, um git ls-files <TAB>die Argumente für Folgendes zu erhalten git ls-files:

$ g ls --<TAB>
--abbrev                 -- set minimum SHA1 display-length
--cached                 -- show cached files in output
--deleted                -- show deleted files in output
# Etc...

Dies ist nicht einfach eine Einstellung gfür die automatische Vervollständigung, gitda ich meine benutzerdefinierten Kurzbefehle den Git-Befehlen zuordne.

Antwort1

Ich /usr/share/zsh/functions/Completion/Unix/_githabe einige Tipps für solche Aliase gefunden und schließlich die folgenden Funktionen für die Aliase definiert:

_git-ls () {
  # Just return the _git-ls-files autocomplete function
  _git-ls-files
}

Dann habe ich einen geraden Weg gemacht compdef g=git. Das Autovervollständigungssystem erkennt, dass Sie beispielsweise laufen, g lsund verwendet die _git-lsAutovervollständigungsfunktion.

Vielen Dank an user67060, der mich in die richtige Richtung gelenkt hat.

Antwort2

Ich musste etwas sehr Ähnliches tun, also sollte dies Ihr Problem in etwa lösen.

_g () {
    case "${words[2]}" in
      ls) words[1,2]=(git ls-files);;
      g) words[1,2]=(git grep);;
      *) return 1;;
    esac

    _git # Delegate to completion
}
compdef _g g

Beachten Sie, dass Sie die $CURRENTVariable anpassen müssen, wenn Sie die Anzahl der Argumente ändern.

Antwort3

Ich würde Folgendes tun:

_tg () {
    local _ret=1
    local cur cword prev

    cur=${words[CURRENT]}
    prev=${words[CURRENT-1]}
    cmd=${words[2]}
    let cword=CURRENT-1

    case "$cmd" in
    ls)
        emulate ksh -c _git_ls_files
        ;;
    g)
        emulate ksh -c _git_grep
        ;;
    esac

    let _ret && _default && _ret=0
    return _ret
}

compdef _tg tg

Allerdings wird hier die Vervollständigung von Git und nicht die von zsh verwendet:

https://git.kernel.org/cgit/git/git.git/tree/contrib/completion/git-completion.zsh

verwandte Informationen