definir a função auxiliar de conclusão de tabulação para usar em vários arquivos de conclusão (zsh)

definir a função auxiliar de conclusão de tabulação para usar em vários arquivos de conclusão (zsh)

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

Os comandos são diferentes o suficiente para que eu queira escrever conclusões diferentes para eles em arquivos diferentes. (ou seja, a conclusão de do_thingAestá em um arquivo _do_thingAcom um #compdef do_thingAcabeçalho e a conclusão de do_thingBestá em _do_thingBwith #compdef do_thingB).

Por mais diferentes que sejam, todos os comandos têm um argumento em comum. Portanto, com todas as coisas que diferem entre os comandos, em algum momento todos _do_thingos arquivos contêm algo parecido

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

Gostaria de evitar ter o mesmo _helper_functiondefinido em todos _do_thingos arquivos. E ainda por cima, gostaria de permitir que os usuários forneçam os seus próprios (melhor personalizados _helper_function).

Qual é a melhor maneira de conseguir isso?

coisas consideradas:

guarda de definição

Eu já sei que posso evitar sobrescrever _helper_functionse já estiver definido com

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

que eu poderia colocar em cada um dos _do_thingarquivos. Mas eu preferiria terceirizar isso _helper_functionem um arquivo separado _helper_function.

colocando o corpo da função em arquivo separado

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

Responder1

Um método seria colocar _helper_functionem algum lugar fpathe depois em.zshrc

autoload -U _helper_function

Então, se o usuário quiser personalizá-lo, basta colocar um novo _helper_functionarquivo fpathde forma que a versão dele 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
% 

informação relacionada