定義選項卡完成輔助函數以在多個完成檔案 (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
% 

相關內容