zsh:如何识别zsh补全函数来自哪个文件?

zsh:如何识别zsh补全函数来自哪个文件?

在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.

相关内容