함수 요약은 함수 파일 디렉터리와 동일하지 않습니다!

함수 요약은 함수 파일 디렉터리와 동일하지 않습니다!

zcompile다음과 같은 요약을 생성하는 기능이 있습니다.

function fpath-setup {
  local FLATFPATH="${TMPPREFIX}-${ZSH_VERSION}-fpath.zwc"

  function {
      typeset -a zarr

      blacklist=('ztodo' 'zed')
      blacklist="^(${(j:|:)blacklist})"

      setopt LOCAL_OPTIONS EXTENDED_GLOB

      for fp in "$fpath[@]"; do
        local ztail=(${zarr:t})
        for it in "${fp}/"$~blacklist; do
          if [[ -z "${ztail[(r)${it:t}]}" ]]; then
            if zcompile "${TMPPREFIX}-try-zcompile" "${it}" &>/dev/null; then
              zarr+="${it}"
            else
              echo "CANNOT COMPILE: ${it}"
            fi
          else
            echo "DUPLICATE: ${it}"
          fi
        done
      done

      zcompile "${FLATFPATH}" "$zarr[@]"

      zcompile -t "${FLATFPATH}" 'compinit' '_complete' || {
        print "Important functions missing from ${FLATFPATH}" >&2
        return 1
      }
  }

  if (( $? )); then
    print "The fpath is left unchanged." >&2
    return 1
  else
    fpath=("${FLATFPATH}")
  fi
}

실행하면 $fpath다음과 같습니다.

/usr/local/share/zsh/site-functions
/usr/local/Cellar/zsh/5.2/share/zsh/functions

실행하고 나면 $fpath다음과 같습니다.

/var/folders/kb/ydt74z19765cv9vb86rwvcrr0000gn/T/zsh-5.2-fpath.zwc

여기에서 볼 수 있듯이 Zsh의 핵심 기능은 요약되어 있습니다.

https://ghostbin.com/paste/wgauy

이 프롬프트 테마를 사용해 보기 전까지는 잘 작동하는 것 같았습니다.

https://github.com/sindresorhus/pure/blob/master/pure.zsh#L328

메시지가 나타날 때마다 다음 오류가 발생합니다.

vcs_info: configured unknown backend: 'git'
vcs_info: use 'vcs_info_printsys' to find supported systems.

이 문제는 다이제스트를 먼저 생성하지 않거나 프롬프트를 호출하기 전에 다음 명령을 실행하여 해결할 수 있습니다.

autoload -Uz VCS_INFO_get_data_git VCS_INFO_detect_git

그래서 내 질문은:

  1. zcompile핵심 Zsh 기능을 사용하는 것은 나쁜 생각입니까?
  2. 다이제스트를 사용할 때는 수동으로 autoload작업을 수행해야 zcompile하지만 디렉터리의 일반 파일을 사용할 때는 수행하지 않는 이유는 무엇입니까?

편집하다:

나는 더 많은 조사를 했고 비슷한 것을 발견했습니다 fpath.

/var/folders/kb/ydt74z19765cv9vb86rwvcrr0000gn/T/zsh-5.2-circuit.zwc

주문하다:

prompt pure # ...vcs_info errors
print -f '%s\n' "${(k)functions[@]}" | grep VCS_INFO_get_data_git

아무것도 반환하지 않습니다. 그러나 다음과 같이 fpath를 사용하십시오.

/var/folders/kb/ydt74z19765cv9vb86rwvcrr0000gn/T/zsh-5.2-fpath.zwc
/usr/local/Cellar/zsh/5.2/share/zsh/functions

주문하다:

prompt pure # NO vcs_info errors!
type $(print -f '%s\n' "${(k)functions[@]}" | grep VCS_INFO_get_data_git)

반품:

VCS_INFO_get_data_git is a shell function from /var/folders/kb/ydt74z19765cv9vb86rwvcrr0000gn/T/zsh-5.2-fpath.zwc/VCS_INFO_get_data_git

따라서 어떻게 든 코어 디렉토리가 존재한다는 것만 /usr/local/Cellar/zsh/5.2/share/zsh/functions으로 VCS_INFO_get_data_git/var/folders/kb/ydt74z19765cv9vb86rwvcrr0000gn/T/zsh-5.2-fpath.zwc.

이것은 Zsh가 핵심 디렉토리를 특별하게 취급한다는 것을 의미합니까? 이 이론을 테스트하기 위해 핵심 함수 파일을 임시 위치에 복사했습니다.

cp -r /usr/local/Cellar/zsh/5.2/share/zsh/functions /tmp

그런 다음 새 세션에서 다음과 같이 fpath를 사용하십시오.

/var/folders/kb/ydt74z19765cv9vb86rwvcrr0000gn/T/zsh-5.2-fpath.zwc
/tmp/functions

주문하다:

prompt pure # NO vcs_info errors!!
type $(print -f '%s\n' "${(k)functions[@]}" | grep VCS_INFO_get_data_git)

반품:

VCS_INFO_get_data_git is a shell function from /var/folders/kb/ydt74z19765cv9vb86rwvcrr0000gn/T/zsh-5.2-fpath.zwc/VCS_INFO_get_data_git

그래서 Zsh는 핵심 디렉토리를 특별히 취급하지 않는다는 결론을 내려야 합니다. 그러나 VCS_INFO_get_data_git해당 이름의 파일이 어떤 디렉토리에 존재하면 자동으로 로드됩니다 fpath... 그러나 먼저 오면 Zsh는 여전히 다음에서 로드됩니다. 다이제스트 fpath.

이것은 매우 이상합니다.

나는 이 동작이 어디에서도 문서화된 것을 본 적이 없으며 Zsh가 이것을 어떻게 구현하는지 명확하지 않습니다(Zsh 내부를 아는 사람이 설명할 수 있을 것입니다).

자동 로드가 언제 발생하는지 확인하기 위해 fpath다음을 변경하여 새 세션을 조작했습니다 fpath.

/var/folders/kb/ydt74z19765cv9vb86rwvcrr0000gn/T/zsh-5.2-fpath.zwc
/tmp/functions

/tmp/functions디렉터리를 삭제하려면 :

/var/folders/kb/ydt74z19765cv9vb86rwvcrr0000gn/T/zsh-5.2-fpath.zwc

그런 다음 프롬프트를 변경하려고 합니다.

prompt pure

이전과 마찬가지로 원래 vcs_info오류가 발생합니다.

vcs_info: configured unknown backend: 'git'
vcs_info: use 'vcs_info_printsys' to find supported systems.

확실히 하려면 다음을 테스트해 보세요.

print -f '%s\n' "${(k)functions[@]}" | grep VCS_INFO_get_data_git

아무것도 반환하지 않습니다! 이제 이 시점에서 /tmp/functions디렉터리를 Back에 다시 추가 하면 fpath다음과 같습니다.

/var/folders/kb/ydt74z19765cv9vb86rwvcrr0000gn/T/zsh-5.2-fpath.zwc
/tmp/functions

오류가 vcs_info지속됩니다!

Zsh 버전 5.2에서 정확히 무슨 일이 일어났는지 설명할 수 있는 사람이 있나요?

답변1

비슷한 일을 하고 있으니 뭔가 유용한 게 있을 것 같아요.

이렇게 하고 man zshmisc"자동 로딩 기능" 섹션으로 이동하면 이에 대한 약간의 설명이 있습니다. http://zsh.sourceforge.net/Doc/Release/Functions.html

여기서 제가 지적하고 싶은 것은 두 가지입니다.

-U첫째, 귀하의 문제 중 하나는 위의 플래그를 놓친 것입니다 .

자동 로드 내장 함수 또는 이에 상응하는 기능에 -U 옵션을 지정하면 읽는 동안 일반적인 별칭 확장이 억제됩니다. zsh 배포판에서 제공하는 기능을 사용하는 것이 좋습니다. zcompile 내장 명령을 사용하여 사전 컴파일된 함수의 경우 해당 정보가 후자로 컴파일되므로 .zwc 파일을 생성할 때 -U 플래그를 제공해야 합니다.

두 번째는 fpath 변수에서 자동 로드하는 방법입니다(해당 페이지를 읽는 것이 좋지만 여기에 요약되어 있습니다).

elementfpath 항목이며 function자동 로드를 시도하는 함수입니다.

자동으로 무언가를 로드하는 방법에는 3가지가 있습니다.

  1. 이름의 파일이 있으면 element.zwc해당 파일을 로드하여 기능을 검색합니다. (소화). 개인적으로 이 문제를 더 자세히 조사해야 하지만 .zwc 파일을 사용하여 zwc 파일에 무엇이 있는지 확인할 수 있습니다 zcompile -t. (위에서 이 내용을 사용한 것으로 알고 여기에 게시했습니다.)

  2. 3개가 캐릭터 파일(컴파일된 파일)인 경우 element/function.zwc

  3. 일반적인 것은 fpath에 있는 파일인 경우입니다(그렇습니다 element/function).

man zshbuiltins또한 매뉴얼 페이지를 확인 하고 찾으십시오 zcompile. 및 를 사용하여 모든 함수 또는 모든 자동 로드된 함수를 컴파일 -c할 수 있습니다.-ahttp://zsh.sourceforge.net/Doc/Release/Shell-Builtin-Commands.html

.페이지에서 내장 기능을 찾으면 zsh 단어 코드에 대한 또 다른 언급도 찾을 수 있습니다. 이를 사용하면 *.zwc파일 버전을 찾아 로드하는 것을 구체적으로 확인할 수 있습니다.

file보다 최신이고 컴파일된 파일 형식(zcompile 내장 명령을 사용하여 생성됨)인 "file.zwc"라는 파일이 발견되면 파일 대신 해당 파일에서 명령을 읽습니다.

zrecompile이라는 자동 로드할 수 있는 함수도 있는데, 약간 관련은 없지만 확인해 보는 것이 좋습니다. 기본적으로 필요에 따라 파일을 다시 컴파일합니다.

https://github.com/zsh-users/zsh/blob/284b5aaeb08f90520ac7dc385e8921471678e7dd/Functions/Misc/zrecompile

관련 정보