Wie setze ich Zsh-Autovervollständigungsregeln für das zweite Argument (der Funktion) auf die Regeln eines vorhandenen Befehls?

9

Ich habe eine 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 Regeln für die automatische Vervollständigung für die kurzen Argumente auf Gits Regeln zu setzen, bin mir aber nicht sicher, wie ich das machen soll.

Zum Beispiel muss ich g ls <TAB>die Regeln ausfüllen, für git ls-files <TAB>die ich die Argumente für Folgendes erhalten würde 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 die gautomatische Vervollständigung, gitda ich meine benutzerdefinierten Kurzbefehle den Git-Befehlen zuordne.

Erik Nomitch
quelle
1
Wenn Ihre Funktion nur kürzere Namen git-Unterbefehlen zuordnet, können Sie hierfür auch das git-Alias-System verwenden. Lesen Sie darüber in der Mapage : man git-config.
Lucas

Antworten:

3

Ich fand heraus, /usr/share/zsh/functions/Completion/Unix/_gitwelche Tipps für Aliase wie diesen vorhanden waren, und definierte schließlich diese Funktionen für die Aliase:

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

Dann habe ich eine Straße gemacht compdef g=git. Das Autocomplete-System erkennt beispielsweise, dass Sie ausgeführt werden, g lsund verwendet die _git-lsAutocomplete-Funktion.

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

Erik Nomitch
quelle
2

Ich musste etwas sehr Ähnliches tun, also ist dies ungefähr das, was Ihr Problem lösen sollte.

_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

Wenn Sie die Anzahl der Argumente ändern, müssen Sie die $CURRENTVariable anpassen .

Kevin Cox
quelle
1

Das würde ich 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

Dies verwendet jedoch die Vervollständigung von Git und nicht die Vervollständigung von zsh:

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

FelipeC
quelle
Vielen Dank, ich bin einen anderen Weg gegangen, da ich nicht wusste, wo ich die Git-Abschlussregeln finden konnte und Fehler bekam. Siehe meine Antwort.
Erik Nomitch