.png)
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_thingA
está en un archivo _do_thingA
con un #compdef do_thingA
encabezado y la finalización de do_thingB
está 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_thing
los archivos contienen algo como
...
_arguments \
...
'-c[common option]:common option:_helper_function' \
...
Me gustaría evitar tener lo mismo _helper_function
definido en todos _do_thing
los 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_function
si ya está definido con
(( $+functions[_helper_function] )) ||
_helper_function() {
...
}
que podría poner en cada uno de los _do_thing
archivos. Pero preferiría subcontratarlo _helper_function
en un _helper_function
archivo 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_function
funció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_function
algún lugar dentro fpath
y luego en.zshrc
autoload -U _helper_function
Luego, si el usuario desea personalizarlo, simplemente coloca un nuevo _helper_function
archivo fpath
de 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
%