在zsh中,如何知道补全函数是在哪个文件中定义或来自哪个文件?
which
可以打印完成的源代码,但它没有提供有关在哪里可以找到包含完成脚本的文件的任何信息。例如,which _git
在 zsh shell 中给出以下输出:
❯❯❯ which _git
_git () {
local _ret=1
local cur cword prev
#... (omitted) ...
let _ret && _default && _ret=0
return _ret
}
而which git
(命令或可执行文件) 给出了确切的路径:
❯❯❯ which -a git
/opt/homebrew/bin/git
/usr/bin/git
我知道补全函数必须位于 中的某个位置$fpath
,因此可以搜索$fpath
来查找_completion
文件。
❯❯❯ for f in $fpath; do \ls $f/_git 2>/dev/null; done
/opt/homebrew/share/zsh/site-functions/_git
/opt/homebrew/Cellar/zsh/5.9/share/zsh/functions/_git
但是有没有简单的方法或内置命令可以做到这一点?
答案1
以下函数与where
内置函数类似,但在$fpath
.它查找可从同名文件加载的函数。如果有多个匹配文件,则仅报告第一个。
function whence-function {
emulate -L zsh
local name locations ret=0
for name; do
locations=($^fpath/$name(N))
if (($#locations != 0)); then
print -l -- $locations[1]
else
ret=1
fi
done
return $ret
}
如果一个函数已经加载,我认为 zsh 不会跟踪它是从哪个文件加载的。例如,一旦_git
加载,很多辅助函数_git_xxx
也被加载,但是像这样的东西whence-function _git_commands
不会告诉你在哪里找到_git_commands
,你必须猜测它来自与_git
.