definir la función auxiliar de finalización de pestañas para usar en varios archivos de finalización (zsh)

definir la función auxiliar de finalización de pestañas para usar en varios archivos de finalización (zsh)

Estoy escribiendo funciones de finalización de zsh para un par de comandos del mismo kit de herramientas.

Los comandos son lo suficientemente diferentes como para querer escribir diferentes terminaciones para ellos en diferentes archivos. (es decir, la finalización de do_thingAestá en un archivo _do_thingAcon un #compdef do_thingAencabezado y la finalización de do_thingBestá en _do_thingB) #compdef do_thingB.

Por muy diferentes que sean, todos los comandos tienen un argumento en común. Entonces, con todas las cosas que difieren entre los comandos, en algún momento todos _do_thinglos archivos contienen algo como

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

Me gustaría evitar tener lo mismo _helper_functiondefinido en todos _do_thinglos archivos. Y además me gustaría permitir que los usuarios proporcionen los suyos propios (mejor personalizados _helper_function).

¿Cuál es la mejor manera de lograr esto?

cosas consideradas:

definicion guardia

Ya sé que puedo evitar sobrescribir el _helper_functionsi ya está definido con

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

que podría poner en cada uno de los _do_thingarchivos. Pero preferiría subcontratarlo _helper_functionen un _helper_functionarchivo separado.

poner el cuerpo de la función en un archivo separado

Si creo un archivo _helper_function(y lo tengo en algún lugar del archivo fpath), su contenido se convertirá en el cuerpo de una _helper_functionfunción. En este escenario, no veo cómo poner el protector de definición alrededor del _helper_function()encabezado (ya que ya no lo escribo).

Respuesta1

Un método sería colocar en _helper_functionalgún lugar dentro fpathy luego en.zshrc

autoload -U _helper_function

Luego, si el usuario desea personalizarlo, simplemente coloca un nuevo _helper_functionarchivo fpathde modo que su versión se encuentre antes que la suya, por ejemplo, en 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
% 

información relacionada