web-dev-qa-db-ja.com

zshの$ PATHキャッシュにオートコンプリートインデックス(またはそれが呼び出されたもの)とバイナリを再構築します

新しいソフトウェアをインストールした後、zshですでに開いている端末は新しいコマンドを認識せず、それらのオートコンプリートを生成できません。どうやら新しいターミナルを開くと問題が解決しますが、オートコンプリートが古いターミナルで機能するように、インデックス(またはそれを呼び出すもの)を再構築できますか?

私はcompinitで試しましたが、それは役に立ちませんでした。また、シェルに依存しない方法はありますか?答えを確認する方法もあると便利です(何かをアンインストールして再インストールする場合を除く)。

つまり、コマンド名のいくつかの文字を入力した後、 Tab、そしてzshは残りの処理を行って完全な名前を取得します。

80
phunehehe

実行可能コマンドのキャッシュを再構築するには、rehashまたはhash -rfを使用します。

hash_list_allオプションの設定を解除していないことを確認してください(ディスクアクセスがさらに少なくなりますが、キャッシュの更新頻度が低くなります)。

コマンドを入力する必要がない場合は、~/.zshrc¹に次の行を挿入して、完了時にzshにそのキャッシュを信頼しないように指示できます。

zstyle ":completion:*:commands" rehash 1

パフォーマンスコストはかかりますが、今日の一般的なデスクトップ設定では無視できます。 (NFSに$PATHがあるか、RAMが不足しているシステムの場合はそうではありません。)

zstyleコマンド自体は、zshmoduleのマニュアルページに記載されています。スタイル値はzshcompsysおよびzshcompwidのマニュアルページに記載されています。または、ソース(ここでは_command_names関数)を読み取ることができます。読みやすいドキュメントが必要な場合...見つけた場合はお知らせください。

¹ zsh≥4.3.3が必要です、ありがとう Chris Johnsen

新しいコマンドで「引数の完了」が機能しない場合は、おそらくcompinitが必要なコマンドですが、キャッシュメカニズムが原因で問題が発生している可能性があります。

私のバージョン(4.3.10)のドキュメントでは、compinitはキャッシュされた「ダンプファイル」_.zcompdumpを使用してコンパイル済みの完了関数を格納し、後続の呼び出しを高速化するとしています。完了ファイル(#compdef …または#autoload …で始まるfpath要素ファイル)の数の変化に気付いた場合にのみ、ダンプファイルを無効にします。おそらく新しいソフトウェアをインストールすると、そのような補完ファイルの数が変更される(その場所にzshオートコンプリートファイルもインストールされていると想定)ため、単純なcompinitを作業。それが機能しない状況にある場合は、ダンプファイルをバイパスするか手動で無効にする必要がある場合があります。

ダンプファイルの使用をスキップするには、compinit -Dを使用します。これは現在のシェルにのみ影響します。

ダンプファイルを再構築するには、それを削除してcompinitを再実行します。

rm -i ${ZDOTDIR:-${HOME:?No ZDOTDIR or HOME}}/.zcompdump &&
compinit

これは、現在のシェル、プレーンcompinitを実行する既存のシェル、および将来のシェルに影響します。

13
Chris Johnsen

#compdef _foo fooを含むファイルに存在する補完を処理/開発する場合、編集ごとに使用する必要があることがわかりました。

unfunction _foo && compinit

更新されたfooコマンドが更新された変更を完了したことを確認するため。

0
Micah Elliott