defina a função auxiliar de conclusão da guia para usar em vários arquivos de conclusão (zsh)

1

Estou escrevendo funções de conclusão do zsh para alguns comandos do mesmo kit de ferramentas.

Os comandos são diferentes o suficiente para que eu queira escrever diferentes conclusões para eles em arquivos diferentes. (ou seja, a conclusão de do_thingA está em um arquivo _do_thingA com um cabeçalho #compdef do_thingA e a conclusão de do_thingB está em _do_thingB com #compdef do_thingB ).

Por mais diferentes que sejam, todos os comandos têm um argumento em comum. Assim, com todas as coisas que diferem entre os comandos, em algum ponto todos os arquivos _do_thing contêm algo ao longo das linhas

...
_arguments \
...
  '-c[common option]:common option:_helper_function' \
...

Eu gostaria de evitar ter o mesmo _helper_function definido em todos os arquivos _do_thing . E no topo, gostaria de permitir que os usuários forneçam os seus próprios (melhor personalizado _helper_function ).

Qual é a melhor maneira de conseguir isso?

coisas consideradas:

guarda de definição

Eu já sei que posso me impedir de sobrescrever o _helper_function se ele já estiver definido com

(( $+functions[_helper_function] )) ||
_helper_function() {
  ...
}

que eu poderia colocar em todos os arquivos _do_thing . Mas eu preferiria terceirizar o _helper_function em um arquivo _helper_function separado.

colocando o corpo da função em um arquivo separado

Se eu criar um arquivo _helper_function (e tê-lo em algum lugar no fpath ), seu conteúdo se tornará o corpo da função de uma função _helper_function . Neste cenário, não vejo como colocar o guarda de definição em torno do cabeçalho _helper_function() (já que eu não escrevo mais).

    
por pseyfert 01.06.2018 / 14:55

1 resposta

1

Um método seria colocar _helper_function em algum lugar em fpath e, em seguida, em .zshrc

autoload -U _helper_function

Então, se o usuário quiser personalizá-lo, basta colocar um novo arquivo _helper_function em fpath , de forma que sua versão seja encontrada antes da sua, por exemplo, em um firstfuncdir :

% cd
% mkdir firstfuncdir
% fpath=(~/firstfuncdir $fpath)
% print -l $fpath
/Users/jhqdoe/firstfuncdir
/Users/jhqdoe/.zsh/functions/darwin
/Users/jhqdoe/.zsh/functions
/usr/local/share/zsh/site-functions
/opt/local/share/zsh/site-functions
/opt/local/share/zsh/5.5.1/functions
% 
    
por 01.06.2018 / 16:31