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
.