определить вспомогательную функцию автодополнения по табуляции для использования в нескольких файлах автодополнения (zsh)

определить вспомогательную функцию автодополнения по табуляции для использования в нескольких файлах автодополнения (zsh)

Я пишу функции автодополнения zsh для нескольких команд из того же инструментария.

Команды настолько различаются, что мне хочется написать для них разные дополнения в разных файлах. (т. е. дополнение для do_thingAнаходится в файле _do_thingAс #compdef do_thingAзаголовком, а дополнение для do_thingB— в _do_thingBwith #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
% 

Связанный контент