「Escape」を押しても実行されない「Alt」を含むキーボードショートカットを作成します。

「Escape」を押しても実行されない「Alt」を含むキーボードショートカットを作成します。

私は次のマッピングを作成しました。~/.zshrc

bindkey -s '^[u' 'whatever string'

vim次のルールを設定してパターンを有効にしました。~/.zshrc

bindkey -v

私が経験している問題は、挿入モードにあるときに通常モードに入りたいときに発生します。Escapeを押すと、カーソル位置のコマンドプロンプトに追加されますuwhatever stringこれは、 を押すたびにEscape押すことができない唯一のキーはu通常モードに入ることです。それ以外の場合は追加しますwhatever string

だから私の質問は、[次へ]をクリックして切り替えられないように追加するようにAlt + uマッピングする方法です。whatever stringEscapeu

PD1:これは最小限の作業例です。

PD2:現在使用中の解決策はキーを押すことです。Escape + {no map} + u{no map}まだマップされていないキーはどこにありますかAlt?)

答え1

〜のように@JdeBPと言う、ユーザーがキーを押し続けると、端末はEscapeU u+ 001B U + 0075()などの同じ文字シーケンスを送信します。uAlt\eu

Altただし、+の場合はu2つの文字を同時に送信しますが、その場合、Escapeユーザーuは2つの文字を同時に押さないため、転送と文字の間に遅延があるため、通常はアプリケーションで知ることができます。チャイナはどこ。\eu

行エディタでzshキーバインディングがあるときにキー押下が受信後数センチ秒以内に受信されないか、以外の文字がある場合に実行されます。xxyxy$KEYTIMEOUTxy

デフォルトは$KEYTIMEOUT40(0.4秒)です。この値を使用すると、ユーザーは手動で複数文字のバインディングを入力できますが、複数文字のバインディングキーの組み合わせまたはファンクションキーが押されたときにのみトリガーされるように、人がキーシーケンスを入力しすぎないほど小さく設定できます。

たとえば、1(0.01秒)に変更すると、バインディングが実行された後にすばやく入力する必要があり$KEYTIMEOUTます。uEscape\eu

これは zsh に限定されません。カスタムキーバインディングを可能にするほとんどの対話型端末アプリケーションには同じ設定があります。たとえば、行エディタ(、、、...readlineを使用)では、これは変数(デフォルトは0.5秒)で、ビュー変数と環境変数(デフォルトは1秒)は1です。第二)。bashpythongdbkeyseq-timeoutncursesESCDELAYvimtmttm

答え2

端末が(仮想)ワイヤを介してホストに文字を送信すると、違いなしキーシーケンスEsc Uとキーコード間⎇ Alt+Uまたは複合キーシーケンス間⎈ Control+ [ U

それらはすべて文字の後に文字としてエンコードされますu。 Zシェルは、端末からの入力文字ストリームに違いを見ないため、区別できません。ターミナルI / Oアプリケーションは、キーストロークではなく文字を表示します。

関連情報