defina la función auxiliar de finalización de tabulación para usar en varios archivos de finalización (zsh)

1

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

Los comandos son lo suficientemente diferentes que quiero 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á dentro _do_thingBde #compdef do_thingB).

Tan diferentes como son, todos los comandos tienen un argumento en común. Entonces, con todas las cosas que difieren entre los comandos, en algún momento todos los _do_thingarchivos contienen algo similar

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

Me gustaría evitar tener el mismo _helper_functiondefinido en todos los _do_thingarchivos. Y además, me gustaría permitir que los usuarios proporcionen los suyos (mejor personalizados _helper_function).

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

cosas consideradas:

guardia de definición

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

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

que pude poner en cada uno de los _do_thingarchivos. Pero preferiría externalizar el _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 fpath) su contenido se convertirá en el cuerpo de la función 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 yo mismo).

pseyfert
fuente

Respuestas:

1

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

autoload -U _helper_function

Luego, si el usuario desea personalizarlo, simplemente coloca un nuevo _helper_functionarchivo para fpathque 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
% 
thrig
fuente