.png)
Я пишу функции автодополнения zsh для нескольких команд из того же инструментария.
Команды настолько различаются, что мне хочется написать для них разные дополнения в разных файлах. (т. е. дополнение для do_thingA
находится в файле _do_thingA
с #compdef do_thingA
заголовком, а дополнение для do_thingB
— в _do_thingB
with #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
%