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
だから私の質問は:
zcompile
コアZsh機能を使用するのは悪い考えですか?- ダイジェストを使用するときは手動で
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変数から自動ロードする方法です(該当するページを読むことをお勧めしますが、ここで要約されています)。
element
fpath エントリであり、function
自動ロードを試みる関数です。
自動的に何かをロードする方法は3つあります。
名前のファイルがある場合は、そのファイルを
element.zwc
ロードして機能を検索します。 (消化)。個人的にはこの問題をさらに調査する必要がありますが、.zwcファイルを使用してzwcファイルに何があるかを確認できますzcompile -t
。 (上記でこの内容を使用したことを知ってここに投稿しました。)3つがキャラクターファイル(コンパイル済みファイル)の場合
element/function.zwc
一般的なものはfpathのファイルの場合です(はい
element/function
)。
man zshbuiltins
また、マニュアルページを確認して検索してくださいzcompile
。とを使用して、すべての関数またはすべての自動ロードされた関数をコンパイル
-c
できます。-a
http://zsh.sourceforge.net/Doc/Release/Shell-Builtin-Commands.html
.
ページで組み込み機能を見つけると、zshの単語コードへの別の言及も見つけることができます。これにより、*.zwc
ファイルのバージョンを見つけて読み込むことを具体的に確認できます。
file より最新でコンパイルされたファイル形式 (zcompile 組み込みコマンドを使用して生成された) "file.zwc" というファイルが見つかった場合は、ファイルの代わりにそのファイルからコマンドを読み込みます。
zrecompileという自動ロードできる関数もありますが、少し関連はありませんが、確認してみることをお勧めします。デフォルトでは、必要に応じてファイルを再コンパイルします。