zshに他のバインディングがない場合、一致するユニバーサルキーバインディングは何ですか?

zshに他のバインディングがない場合、一致するユニバーサルキーバインディングは何ですか?

存在する魚の皮、他のバインディングがない場合は、空の文字列(「 」など)のSEQUENCEを指定して、一致するユニバーサルキーバインディングを設定できます。

たとえば、

bind '' self-insert

確認しましたzshのドキュメント同様の機能については、次のように言います。

-中

選択したキーマップに組み込まれたメタキーバインディングセットを追加します。バインド解除されたキーまたは自己挿入にバインドされたキーのみが影響を受けます。

私の目的に合わせて使用​​できるかどうかわかりません。

zshに他のバインディングがない場合、一致するユニバーサルキーバインディングは何ですか?

答え1

zshキーへのマッピング(ターミナルから送信されたバイトシーケンス)が見つからないときに呼び出されるウィジェットは、デフォルトでビープ音が鳴るundefined-keyウィジェットですが、それを別のものにオーバーライドできます。たとえば、次のようになります。

undefined-key() {
  zle -M "${(q+)KEYS} is not bound to anything"
  zle .$WIDGET
}
zle -N undefined-key

または、カーソルの左側に生のバイトを挿入します。

undefined-key() LBUFFER+=$KEYS
zle -N undefined-key

またはなどのキーマップでは、バイト範囲にバインドされ、キーにバインドされていself-insertません。self-insertemacsviinsR

$ bindkey | awk '$NF == "self-insert"'
" "-"~" self-insert
"\M-^@"-"\M-^?" self-insert

^?127(バインド)を除く32(スペース)から255(M-^?)までのすべてのバイト値backward-delete-char

次の方法で他のコンテンツにバインドできます。

my-self-insert() { zle -M "You entered <$KEYS>"; zle self-insert; }
zle -N my-self-insert
for range (' -~' '\x80-\xff') bindkey -R $range my-self-insert

おそらくより慣用的な方法は、次を上書きすることですself-insert

self-insert() { zle -M "You entered <$KEYS>"; zle .$WIDGET; }

マルチバイト文字の場合、ウィジェットは文字の各バイトに対して一度呼び出され、私が知っている限り、範囲は単一バイトのみに制限できます。

self-insertまた、常に次のようにすることができますが、シングルバイトでのみ機能します。

my-self-insert() {
  zle -M "You entered <$KEYS>"
  repeat ${NUMERIC-1} LBUFFER+=$KEYS
}
for c ({$'\ua0'..$'\uff'}) bindkey $c my-self-insert

Unicode 文字 U+00A1 から U+00FF にバインドし (行編集バッファの左側の部分) に (ウィジェットを呼び出す端末が送信されるようにするバイトまたはバイトシーケンス) を追加してmy-self-insert手動で自己挿入を実行します。 。$KEYS$LBUFFER

関連情報