Come posso impostare le regole di completamento automatico Zsh per il secondo argomento (della funzione) sulle regole di un comando esistente?


9

Ho una funzione Zsh personalizzatag :

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

Al suo interno, gestisco brevi argomenti che eseguono i comandi Git. Per esempio:

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

Devo essere in grado di impostare le regole di completamento automatico sulle regole di Git per gli argomenti brevi, ma non sono sicuro di come farlo.

Ad esempio, ho bisogno g ls <TAB>di compilare una scheda per le regole per le git ls-files <TAB>quali mi darebbero gli argomenti per 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...

Non si tratta semplicemente di impostare il gcompletamento automatico gitpoiché sto mappando i miei comandi brevi personalizzati sui comandi Git.


1
Se la tua funzione associa solo nomi più brevi ai sottocomandi git, puoi anche usare il sistema alias git per questo. Leggi nel mapage: man git-config.
Lucas,

Risposte:


3

Ho scoperto /usr/share/zsh/functions/Completion/Unix/_gitche aveva alcuni suggerimenti per gli alias come questo e ho finito per definire queste funzioni per gli alias:

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

Quindi, ho fatto una scala compdef g=git. Il sistema di completamento automatico vedrà che sei in esecuzione, ad esempio, g lse utilizzerà la _git-lsfunzione di completamento automatico.

Grazie a user67060 per avermi guidato nella giusta direzione.


2

Ho dovuto fare qualcosa di molto simile, quindi questo è all'incirca ciò che dovrebbe risolvere il tuo problema.

_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

Una cosa da notare è che se si modifica il numero di argomenti, sarà necessario regolare la $CURRENTvariabile.


1

Questo è quello che vorrei fare:

_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

Tuttavia, questo sta usando il completamento di Git, non il completamento di zsh:

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


Grazie, ho finito per seguire una strada diversa poiché non sapevo dove trovare le regole di completamento di Git e stavo ottenendo errori. Vedi la mia risposta
Erik Nomitch,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.