Como definir regras de preenchimento automático Zsh para o segundo argumento (de função) para as regras de um comando existente?

9

Eu tenho uma função Zsh personalizadag :

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

Dentro dele, trato de breves argumentos que executam comandos Git. Por exemplo:

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

Eu preciso ser capaz de definir as regras de preenchimento automático para as regras do Git para os breves argumentos, mas não tenho certeza de como fazer isso.

Por exemplo, preciso g ls <TAB>preencher com tabulação as regras git ls-files <TAB>que me forneceriam os argumentos para 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...

Isso não é simplesmente definir o gpreenchimento automático, gitpois estou mapeando meus comandos curtos personalizados para os comandos Git.

Erik Nomitch
fonte
1
Se sua função mapeia apenas nomes mais curtos para subcomandos do git, você também pode usar o sistema de alias do git para isso. Leia sobre isso no mapage: man git-config.
18716 Lucas

Respostas:

3

Eu descobri /usr/share/zsh/functions/Completion/Unix/_gitque tinha algumas dicas para aliases como este e acabei definindo essas funções para os aliases:

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

Então, eu fiz uma sequência compdef g=git. O sistema de preenchimento automático verá que você está executando, por exemplo, g lse usará a _git-lsfunção de preenchimento automático.

Agradeço ao user67060 por me guiar na direção certa.

Erik Nomitch
fonte
2

Eu tive que fazer algo muito semelhante, então é isso que deve resolver o seu 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

Uma coisa a observar é que, se você alterar o número de argumentos, precisará ajustar a $CURRENTvariável.

Kevin Cox
fonte
1

Isto é o que eu faria:

_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

No entanto, isso está usando a conclusão do Git, não a conclusão do zsh:

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

FelipeC
fonte
Obrigado, acabei seguindo um caminho diferente, pois não sabia onde encontrar as regras de conclusão do Git e estava recebendo erros. Veja minha resposta.
Erik Nomitch