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

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

同じツールキット内の複数のコマンドに対してzsh完了機能を作成しています。

コマンドは、異なるファイルに異なる補完を作成したいほど異なります。 (つまり、 の完成はヘッダーがあるファイルにあり、 のdo_thingA完成はヘッダーがあるファイルにあります。)_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

1つの方法は、まず_helper_functionどこかに配置しfpath、次に別の場所に配置することです。.zshrc

autoload -U _helper_function

その後、ユーザーがそれをカスタマイズしたい場合は、そのバージョンがあなたのバージョンの前に見つかるように新しい_helper_functionファイルを置きます。たとえば、次のようになります。fpathfirstfuncdir

% 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
% 

関連情報