定义选项卡完成辅助函数以在多个完成文件 (zsh) 中使用

定义选项卡完成辅助函数以在多个完成文件 (zsh) 中使用

我正在为同一工具包中的几个命令编写 zsh 补全函数。

这些命令足够不同,我想在不同的文件中为它们编写不同的完成。 (即, 的完成是在带有标头的do_thingA文件中,而 的完成是在with中)。_do_thingA#compdef do_thingAdo_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
% 

相关内容