TAB キーを押すまで zsh パス補完魔法が発生しないようにするにはどうすればよいですか?

TAB キーを押すまで zsh パス補完魔法が発生しないようにするにはどうすればよいですか?

私は複数のUSBハードドライブを含む趣味のサーバーを持っています。これらのドライブは、必要に応じて素早くアクセスできる基本的なコールドストレージなので、積極的な電源管理と短いスピンアップタイムアウトを有効にしました。そのため、ほとんどはアクセスが必要になるまでAPMの待ち時間の99.9%を消費します。 。

ZSH完成システムはこれに関して私に頭痛を与えます。なぜなら、それが提供するオートコンプリート機能はかなりクールです。TABを押さなくても、シェルコマンドをナビゲートするために矢印を使用しても、自動化されたパスの種類を実行するからです。履歴キー。

たとえば、次のように入力し、rsync上キーを押して前のコマンドのrsync履歴を確認し、魔法が完了したらすぐにそのコマンド内のファイルシステムパスにアクセスして魔法の操作を確認して実行します。これにより、zshがブロックされ、応答しない大規模な一時停止が発生するだけでなく、休止状態ドライブを回転させ、そのスピナーの摩耗を増やします。すべてのネットワークインストールパスは、ネットワークの特性によって遅延が発生する可能性があります。

パスを作成するときにも機能します。文字、スラッシュ、ワイルドカードを入力するだけです。

似たような不満がたくさん見えましたが、このようにしかし、この問題を正確に解決する方法が見つかりませんでした。

上記の投稿にはzsh Completion Systemのドキュメントへのリンクがあり、それを読んでいる間はまだ混乱していました。文書を見ると、構文が何なのかもわからないし、多くのzstyle用語のために混乱している。

基本的に私はzshに次のように言う方法を探しています。 「聞いて、私はあなたがすることが好きですが、あなたのすべての魔法を使い、私がTABキーを押すまで待つことができますか?」

答え1

Zshは、「一般」構成でTabキーを押さない限り、いかなる種類の完了魔法も実行しません。可能ですが、いくつかの深刻な拡張が必要です。

zsh構成フレームワークを使用している場合は、おそらくこの機能が標準で提供されます。無効にする方法を見つけるには、zsh自体のドキュメントではなく、そのフレームワークのドキュメントを見つける必要があります。

この機能の説明に基づいてラインエディタ何らかの方法でカスタマイズされたでしょう。この動作を実行するためにどこかにフックを定義できるのか、それとも自己挿入をオーバーライドする必要があるのか​​わかりません。主な入札リストを作成bindkeyし、目立つものがあることを確認してください。たぶんあなたが得るものと比較することができます(これは他の設定ファイルをzsh -f読み取らずにzshを起動します)。.zshrc

何が起こっているのか混乱している場合は、実行されているすべてのコマンドをファイルに書き込むように指示できます。 (set -x端末には単純なログがありますが、実際に使用するには多すぎるようです。)

exec 2>zsh.log; set -x

キャンセル:

set +x; exec 2>/dev/tty

完了プロセスを追跡するには(完了していないシーンで完了などのアクションをトリガーするのではなく)、次のコマンドを実行できます。_complete_debug^X?デフォルトではバインドされています)を押すのではなくTab

zsh文書は読みにくいです。実行したい操作に近い例を見つけて、必要なコマンド/変数/関数/...を見つけたら、ドキュメントを調べることをお勧めします。これzstyleドキュメントはどのように機能するかを説明しますが、完成システムで使用される方法を理解するには理解する必要があります。使用された zstyle コンテキストの完成構文、それがどこで使用されているかを知るには、それを使用する関数のドキュメントを見つけるか、時々ソースコードを読む必要があります。とにかく、問題を解決するためにzstyleについて何も知る必要はありません。完了設定だけでは、完了外の自動動作をトリガーできません(おそらく、自動動作は完了を模倣し、その設定を再利用できますが、まったくそうではありません)。行エディタは少し、おそらくいくつかのカスタムキーバインディングを設定する必要があります。

答え2

(警告:ストーリータイムが好きで、私がデバッグして犯人を見つけた方法に興味がある場合にのみこのコンテンツを読んでください。一部の人は長いコンテンツをうまく処理できません。いいえ。)

さて、犯人を見つけた方法を文書化するので、元の質問を更新する代わりにこれを「答え」として追加します。実際の質問(「誰が私(ああ))zshを遅らせる原因なのか」に対する実際の答えは、上記のGilesの答えです。これは彼のヒントの付録です。やると思いました。 「あなたが好きなものをそこに入れてください(これは嫌いではありません)。

以下は、構成に対する変更をテストするために使用されるいくつかの特定の問題です。

  • たとえば、回転が停止したドライブのフォルダパスに開いたセッションがあります/media/drive-f/Apps。ドライブが回転を停止するのに長い間このセッションを終了しましたが、zshセッションはまだそのパスにあります。ホームフォルダに戻りたいので、をクリックするcdとすぐにczshがブロックされ、ドライブが回転します。私はキーボードを打つことに反応して現在のディレクトリをチェックしたいと思います。
  • 回転しているドライブの場所にパスを入力するか、パス全体を貼り付けると、zsh環境で実行されているものがEnterまたはTabを押す前にドライブを確認しようとし、ドライブが回転中にブロックされます。たとえば、/media/drive-k/Appsパスを貼り付けるとシェルがブロックされます。入力すると、A「アプリケーション」に入力するとシェルがブロックされます。

したがって、Gilesの答えについて述べたように、最初のテストは彼のトリックを使用しzsh -fて完全な一般的なzshセッションを取得することです。たとえば、TABを押すかls位置を回転させない限り、問題はありません。場所がどこかにキャッシュされている限り、ドライブを回転させることなくTABを使用して回転停止位置に移動することもできます。たとえば、Tabキーを使用/media/drive-d/Projectsして切り替え/media/drive-d/P<TAB>、dドライブがまだ回転する可能性があります。これを行うと、ls -lドライブが回転します。

さて、次のステップはGillesのロギング技術を試すことです。このロギングは非常に冗長であり、プラグインを有効にすると、z当時私が持っていた場所とまったく関係のないディレクトリについての混乱したログがたくさん得られました。さらに、シェルをブロックするパスに移動すると、ログはブロックが解放されるまでサイレントを維持します。いいえ。また、すべてのデバッグ出力のコレクションをカプセル化します。

これは事実ではなく、上記の2つの問題を再現しようとして、すべてのプラグインを無効にして1つずつ再度有効にすることにしました。すべてのドライブの回転時間制限を30秒に設定しました。sudo hdparm -S 6 /dev/disk/by-id/usb-*0:0(USBバス上のすべてのドライブをターゲットにし(秒はnumの倍数)5、つまり30秒を使用してそのドライブのパーティションをターゲットにすることを0:0避けるためにサフィックスを使用します。)hdparm-S <num>

ここでの手順は、~/.zshrcすべてのプラグイン(私が持っているplugins=(colored-man-pages git-extras history pj redis-cli urltools z zsh-syntax-highlighting))を編集して無効にすることです。次に、2つの新しいSHELL(更新された設定を読むために)で2番目の問題を再現できるように1つを調べて、最初の問題を再現する準備ができるように空の/media/drive-b/Projectsシェルに移動します。/home/danielその後、30秒間待ってからこれを実行してみてください。

プラグインがロードされない場合、シェルが両方の問題を再現しないことを確認できます。

次に、犯人が見つかるまで各プラグインを順番に再度有効にしてから、説明したように新しいzshセッションを開き、30秒以上待ちました(即時URL〜パスのためにurltoolsが犯人だと思っている間)(完全な免責事項、デバッグの間に過去の形で書かれていますが、まだよくわかりません。

私が間違っています。私は最後まですべてのプラグインを再度有効にしましたzsh-syntax-highlighting。ところで、問題が再開されました。私はすぐに何か抜けたか、何か間違ってテストしていると思いました(おそらく変更を読むために新しいシェルを開くのを忘れましたか?)。それで、それを取り除きzsh-syntax-highlighting、問題をより広範囲に再現しようとしました。大丈夫です。すべてがいつものように行われます。

実際、これは意味があります。cdコマンドが実行されると緑色に変わるプラグインです。そのディレクトリにいるときにcdroms灰色で印刷しようとしています。私はこの機能が好きです。しかし、これらの欠点に耐えるのに十分ではありません。 XD。

あ、サーバーが復旧されてよかったですね。助けてくれてありがとう、ザイルズ。他の人もこれを使用できることを願っています。

関連情報