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


75

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

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

私は何を意味することは、コマンド名の数文字を入力した後、私は押すことができているTab、とzshフルネームをプルアップするために、残りを行う必要があります。


1
既存のシェルが「[新しいコマンド]のオートコンプリートを生成できない」と言う場合、自動補完には2つのタイプがあります。コマンドの位置、および「引数の補完」-既に名前を入力したら、新しいコマンドのオプション/引数を提案するシェルを取得しようとします。どちらが問題を引き起こしていますか?
クリスジョンセン

1
良い質問!私はいつもそれができないと思っていたので、チェックする
つもり

1
オフトピック-人々は非常に気まぐれです4人がお気に入りですが、2人の賛成票のみ...
xenoterracide

@Chrisコマンド名のいくつかの文字を入力してTabキーを押すと、zshは残りを実行してフルネームを取得する必要があります。
プネヘヘ

@xeno私もそれに気づいた。それが好きなものにはかなり珍しいですが、それをupvoteない
マイケルMrozek

回答:


76

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

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

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

zstyle ":completion:*:commands" rehash 1

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

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

¹はzsh≥4.3.3、おかげで必要とクリス・ヨンセンを


3
いずれかの再ハッシュの呪文は、以前に完全にハッシュされたシェルで「新しいコマンド」のコマンド名補完を有効にする必要があります。PATH(またはパス)を設定すると、再ハッシュも発生します。したがって PATH="$PATH"、仕事もします。 HASH_LIST_ALL私のドキュメントではデフォルトとして表示されます。
クリスジョンセン

それが私にとっての答えです。
BaiJiFeiLong

13

新しいコマンドで「引数の補完」の動作に問題がある場合は、おそらくcompinitが必要なコマンドですが、問題を引き起こしている可能性のあるキャッシュメカニズムがあります。

私のバージョン(4.3.10)のドキュメントには、compinitがキャッシュされた「ダンプファイル」を使用して、.zcompdumpコンパイルされた完了関数を格納し、以降の呼び出しを高速化することが記載されています。完了ファイル(またはfpathで始まる要素ファイル)の数の変更に気づいたときにのみ、ダンプファイルが無効になります。おそらく、新しいソフトウェアをインストールすると、そのような補完ファイルの数が変更されます(zshの自動補完ファイルも適切な場所にインストールされていると仮定します)。動作しない場合は、ダンプファイルをバイパスするか、手動で無効にする必要があります。#compdef …#autoload …compinit

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

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

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

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


一部のzshフレームワークzimでは、ホストごとのダンプファイルを使用できます。その場合は、と$zcompdump_file一緒に削除してください.zcompdump
セバスチャン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.