我正在为同一工具包中的几个命令编写 zsh 补全函数。
这些命令足够不同,我想在不同的文件中为它们编写不同的完成。 (即, 的完成是在带有标头的do_thingA
文件中,而 的完成是在with中)。_do_thingA
#compdef do_thingA
do_thingB
_do_thingB
#compdef do_thingB
尽管这些命令各不相同,但它们都有一个共同的参数。因此,由于命令之间存在所有差异,因此在某些时候所有_do_thing
文件都包含类似的内容
...
_arguments \
...
'-c[common option]:common option:_helper_function' \
...
我想避免_helper_function
在所有_do_thing
文件中定义相同的内容。最重要的是,我希望允许用户提供自己的(更好的个性化_helper_function
)。
实现这一目标的最佳方法是什么?
考虑的事项:
定义守卫
我已经知道我可以防止自己覆盖_helper_function
已经定义的
(( $+functions[_helper_function] )) ||
_helper_function() {
...
}
我可以将其放入每个_do_thing
文件中。但我更喜欢将其外包_helper_function
到一个单独的_helper_function
文件中。
将函数体放在单独的文件中
如果我创建一个文件_helper_function
(并将其放在 中的某个位置fpath
),它的内容将成为函数的函数体_helper_function
。在这种情况下,我不知道如何将定义保护放在标题周围_helper_function()
(因为我不再自己编写它)。
答案1
一种方法是先放置_helper_function
在某处fpath
,然后再放置在.zshrc
autoload -U _helper_function
然后,如果用户想要自定义它,他们只需将一个新_helper_function
文件放入其中fpath
,以便在您的版本之前找到他们的版本,例如放入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
%