Zsh

如何查找 zsh 完成定義

  • April 1, 2019

有沒有辦法查找目前載入的 zsh 完成函式(只需將完成定義列印到標準輸出)。

我知道它們儲存在我的 fpath 上的某個地方,我可以做一些事情,比如ag $fpath completionname在文件中找到定義。有沒有更清潔的方法、zsh 函式或其他方法來做到這一點?

該命令的完成函式的名稱foo$_comps[foo]

要查看函式的程式碼myfunc,請執行echo -E $functions[myfunc],或者echo $functions[myfunc]如果您有bsd_echo選項,請執行,或print -rl $functions[myfunc]。所以要查看命令的完成函式的程式碼foo,執行echo -E $functions[$_comps[foo]]。或者,**which $_comps[foo]**如果函式名稱沒有別名,則執行。

這顯示了沒有註釋的程式碼(並且帶有規範化的空格:它是 zsh 內部儲存的字節碼的人類可讀轉儲)。如果要查看程式碼中定義的原始文件,請執行**whence -v $_comps[foo]**或echo $functions_source[$_comps[foo]]. 該functions_source數組僅在載入模組zsh/parameterzmodload zsh/parameter時可用(您可以使用 執行此操作)並且僅在 zsh 5.4 之後才可用。

如果你還沒有使用過這個函式,你會看到類似的東西builtin autoload -XU而不是程式碼,並且沒有原始碼的路徑。要查看源的路徑,**autoload -r $_comps[foo]**首先執行 zsh 以解析源的路徑,然後您可以使用whichorwhence或顯示它$functions_source

zmodload zsh/parameter
(($+_comps[foo])) &&
autoload -r $_comps[foo] &&
((+$functions_source[$_comps[foo]])) &&
cat $functions_source[$_comps[foo]]

引用自:https://unix.stackexchange.com/questions/509869