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.

관련 정보