zsh:zsh補完機能がどのファイルから来るのかを識別する方法は?

zsh:zsh補完機能がどのファイルから来るのかを識別する方法は?

zshで完成機能が定義されているファイルまたはそのファイルから来るファイルをどのように知ることができますか?

which完成したソースコードを印刷することは可能ですが、完成スクリプトを含むファイルを見つけることができる場所に関する情報は提供しません。たとえば、which _gitzsh シェルから次の出力を提供します。

❯❯❯ 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

関連情報