関数の要約は、関数ファイルディレクトリと同じではありません!

関数の要約は、関数ファイルディレクトリと同じではありません!

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

ここで私が指摘したいのは2つのことです。

-Uまず、あなたの問題の1つは上記のフラグを逃したことです。

自動ロード組み込み関数またはそれに対応する機能に-Uオプションを指定すると、読み取り中の一般的なエイリアス拡張が抑制されます。 zshディストリビューションが提供する機能を使用することをお勧めします。 zcompile組み込みコマンドを使用してプリコンパイルされた関数の場合、その情報は後者にコンパイルされるため、.zwcファイルを生成するときに-Uフラグを指定する必要があります。

2つ目は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

関連情報