新しいソフトウェアをインストールした後、zshですでに開いている端末は新しいコマンドを認識せず、それらのオートコンプリートを生成できません。どうやら新しいターミナルを開くと問題が解決しますが、オートコンプリートが古いターミナルで機能するように、インデックス(またはそれを呼び出すもの)を再構築できますか?
私はcompinit
で試しましたが、それは役に立ちませんでした。また、シェルに依存しない方法はありますか?答えを確認する方法もあると便利です(何かをアンインストールして再インストールする場合を除く)。
つまり、コマンド名のいくつかの文字を入力した後、 Tab、そしてzsh
は残りの処理を行って完全な名前を取得します。
実行可能コマンドのキャッシュを再構築するには、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
を実行する既存のシェル、および将来のシェルに影響します。
#compdef _foo foo
を含むファイルに存在する補完を処理/開発する場合、編集ごとに使用する必要があることがわかりました。
unfunction _foo && compinit
更新されたfoo
コマンドが更新された変更を完了したことを確認するため。