%20%E4%B8%AD%E4%BD%BF%E7%94%A8.png)
我正在為同一工具包中的幾個命令編寫 zsh 補全函數。
這些命令足夠不同,我想在不同的文件中為它們編寫不同的完成。 (即, 的完成是在有標頭的do_thingA
文件中,而 的完成是在with中)。_do_thingA
#compdef do_thingA
do_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
%