zshのviエミュレーションでは、エスケープはべきではないですか?


6

私はzshにviのキーバインドを使うように設定しました。私は "エスケープ"といくつかの予期しない動作に気づいた。 vim(私はvanilla viをテストしていない)で、2回escapeを打った場合、 'i'を1回打って挿入モードに戻ることができます。 zshでは、たまたまエスケープを2回押しても 'i'を押しても挿入モードには戻りません。2回押す必要があります。これの別の例はナビゲーションに思いつきます。一度エスケープキーを押すと、期待どおりに '^'と '$'を使用できます。しかし、誤ってエスケープキーを2回(またはそれ以上)押しても、挿入モードに戻って再度エスケープするまでは機能しません。

どういうわけかzshは正しく設定されていませんか、それともzshのviエミュレーションにおける既知の違いにすぎませんか?

回答:


3

私もそうします。私は一般的に私のシェルではemacsバインディングを使っているので、以前は気づいていませんでした。デフォルトの束縛では、vicmdモードでエスケープキーを使うと次の文字を食べるように見えます。これは未定義のキーの処理におけるバグかもしれないようです。

私はこの問題を回避するためにvicmdモードでエスケープキーに対するnoopバインディングを定義しました。

noop () { }
zle -N noop
bindkey -M vicmd '\e' noop

ありがとうございます。私は、vicmdモードでバインディングエスケープによって何かをすることができると期待していましたが、ここで何かもっと起こっているのかどうかわかりませんでした。私は他のユーザーがそれを問題にしていないのに驚いています。たぶん私はviユーザーのことをあまり気にしていないのです。
user1063042

これは何日も私を悩ませてきた、ありがとう!
cchamberlain

2

私はqqxの答えに答えるためにここに十分な評判がないので、私はただ別の答えを提出する必要があるでしょう:

バグではありません。何が起こるかは次の通りです:あなたが最初にESCを押すと、あなたはvi挿入モードからviコマンドモードに切り替わります(明らかに)。それから、viコマンドモードでESCをもう一度押します。問題は、デフォルトでは、ESCはコマンドモードでは何にも束縛されないことです。 しかしながら ESCで始まるマルチキーウィジェットがあります。 あります 境界 - 特に、矢印キーによって送信される制御シーケンス。

したがって、viコマンドモードでESCキーを押すと、ZLEはウィジェットの2回目のキーストロークを待ってそこに座ります。あなたが 'i'(または任意の文字)を打った場合、それがZLEによって静かに消費されるのはそのためです。

その答えは、viコマンドモードで、qqxが彼の答えで述べたのとまったく同じように、ESCを何かに結合することです。


0

これはzsh 5.6.2では問題にならないようです。

考慮すべきことは設定になります KEYTIMEOUT=1 あなたの中に ~/.zshrc

キータイムアウト

バインドされた複数文字シーケンスの読み取り時に別のキーが押されるのをシェルが待つ時間(100分の1秒単位)。

を参照してください zshパラメータのドキュメント

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.