força a função de conclusão de carregamento para zsh (sem forçar sua execução pressionando a guia)

2

Eu quero substituir uma função de conclusão do zsh existente e manter uma referência ao original (daqui) . Por exemplo. para fazer a conclusão da guia sempre sugerir nice como primeira palavra em uma linha de comando:

eval "$(declare -f _normal | sed '1s/.*/_original&/')"
_normal() {
  if [[ $CURRENT == 1 ]] ; then
    # suggest only "nice" as first word
    _wanted commands expl "be nice" compadd nice
  else
    # do normal completion afterwards
    _original_normal
  fi
}

O problema, pelo que entendi agora, é que em um novo zsh _normal ainda não foi carregado:

PROMPT> functions _normal
_normal () {
    # undefined
    builtin autoload -XUz
}

ainda, depois que eu apertei ⇥ pela primeira vez, ele foi carregado:

PROMPT> functions _normal
_normal () {
    local _comp_command1 _comp_command2 _comp_command skip
    if [[ "$1" = -s ]]
    then
        skip=(-s) 
    else
        skip=() 
        _compskip='' 
 <snap>

Isso significa que a redefinição acima de _normal não pode ser feita no meu .zshrc, pois somente o builtin autoload bit é gravado em _original_normal , que não pode ser carregado (nenhum arquivo _original_normal no fpath ) .

Existe uma maneira de eu poder forçar o carregamento de _normal ?

PS: Aparece fazendo a redefinição de _normal funciona se eu fizer isso em um shell depois de apertar a aba antes.

    
por pseyfert 07.01.2017 / 21:58

2 respostas

2

Em zsh, você pode passar o sinal +X para autoload para carregar uma função de $fpath sem executá-la.

Além disso, você pode copiar uma função para um novo nome manipulando a matriz functions .

autoload -Uz +X _normal
functions[_original_normal]=$functions[_normal]
_normal () {
  …
}
    
por 09.01.2017 / 01:18
0

por enquanto eu corro

_normal &> /dev/null || true

_normal como outras conclusões geralmente não devem ser chamadas diretamente do shell e (sem o redirecionamento) uma mensagem de erro é exibida:

_default:compcall:12: can only be called from completion function

o || true parece desnecessário aqui, pois _normal foi chamado assim, não retorna um código de erro.

    
por 08.01.2017 / 00:47