zshで完成機能が定義されているファイルまたはそのファイルから来るファイルをどのように知ることができますか?
which
完成したソースコードを印刷することは可能ですが、完成スクリプトを含むファイルを見つけることができる場所に関する情報は提供しません。たとえば、which _git
zsh シェルから次の出力を提供します。
❯❯❯ 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
。