複数の補完ファイルで使用するタブ補完ヘルパー関数を定義する (zsh)

複数の補完ファイルで使用するタブ補完ヘルパー関数を定義する (zsh)

私は同じツールキットからのいくつかのコマンドに対して zsh 補完関数を作成しています。

コマンドは十分に異なるため、異なるファイルに異なる補完を記述する必要があります。(つまり、 の補完はヘッダーのdo_thingAあるファイルにあり、 の補完はのあるファイルにあります)。_do_thingA#compdef do_thingAdo_thingB_do_thingB#compdef do_thingB

コマンドはそれぞれ異なりますが、共通する引数が1つあります。コマンド間で異なる点がたくさんあるため、ある時点ですべての_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
% 

関連情報