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

9

Eu tenho uma função Zsh personalizada g :

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

Dentro dele, lidei com argumentos curtos que executam comandos do Git. Por exemplo:

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

Eu preciso ser capaz de definir as regras de autocompletar para as regras do Git para os argumentos curtos, mas não tenho certeza de como fazer isso.

Por exemplo, eu preciso de g ls <TAB> para completar as regras para git ls-files <TAB> , o que me daria 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 g como autocomplete para git , já que estou mapeando meus comandos curtos personalizados para os comandos do Git.

    
por Erik Nomitch 06.05.2014 / 19:58

3 respostas

3

Eu achei /usr/share/zsh/functions/Completion/Unix/_git , que 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 um compdef g=git direto. O sistema de autocompletar verá que você está executando, por exemplo, g ls e usará a função de preenchimento automático _git-ls .

Obrigado ao user67060 por me direcionar na direção certa.

    
por 07.05.2014 / 20:05
1

Isso é 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:

link

    
por 07.05.2014 / 13:16
1

Eu tive que fazer algo muito semelhante, então isso é basicamente o 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 notar é que, se você alterar o número de argumentos, precisará ajustar a variável $CURRENT .

    
por 16.09.2016 / 17:25