キーバインディングテーブル?

キーバインディングテーブル?

さまざまなキー入力をすべて変換するキーバインディングテーブルはありますか?私は使用していますが、zshそのようなテーブルがあればどのシェルでも機能すると思います。

私が尋ねる理由は、いくつかのキーバインディングを割り当てたいのですが、それを参照する方法がわからないためです(すでに定義されているキーバインディングを盗みたくない場合)。

たとえば、「zbindkey」には次の内容があります。

[[ "$terminfo[kend]"  == " O"* ]] && \
    bindkey -M emacs "${terminfo[kend]/O/[}"  end-of-line

End... "kend"はこれがキーを参照していることを意味すると推測できます。

交差確認をしてみるとbindkey次のような内容が見えます。

"^E" end-of-line
"^[OF" end-of-line
"^[[F" end-of-line

...それで、行の1つがkeyを参照していると思いますEnd。どれ?

"bindkey"ファイルにもこれがあります:

bindkey "\e[A" history-beginning-search-backward

さて、偶然これが鍵であることがわかりましたUp Arrowが、知らなかったらどうやって見つけることができましたか?

$ bindkey (at CLI)

...同じキーに対して異なる言語を提供します。

"^[[A" history-beginning-search-backward

...しかし、少なくとも今はBindkey-at-CLIで話すことが^[[ABindkey-in-zbindkeyで話すのと同じであることを知っています。\e[Aそれは簡単です。Up Arrow 以前のDOSでは、0;72すべての合法的なキー入力に対して1つの言語でのみスキャンコードを見つけることができました。

テーブルがありますか?あるいは、キーストロークを選択し、terminfo[]「bindkey-at-CLI」で「bindkey-in-zbindkey」する方法、および/または存在する可能性がある他の言語でそれを参照する他の方法を知ることができますか?

scancode同様に、DOSにはキーボードを押すとスキャンコードを取得できるプログラムがありました。とても簡単です。


答えを見ると、すべての可能なバインディングのテーブルを印刷する方法がないと思います。とにかく、「bindkey」は私が望むことをほとんど行います。

pts/2 HP-y5-10-Debian1 root /aWorking/Docs $ bindkey -L
bindkey "^@" set-mark-command
bindkey "^A" beginning-of-line
bindkey "^B" backward-char
bindkey "^D" delete-char-or-list
bindkey "^E" end-of-line
...

すべてではなくても、少なくとも既存のバインディングをすべて見ることができます。可能製本。これで、主要な形式を「一般」用語に変換する方法がある場合は、次のようになります。

bindkey "Home" beginning-of-line

...では幸いです。

ベストアンサー1

ターミナルアプリケーションとターミナルエミュレータ(またはハードウェアターミナル)間のインタフェースは、キーではなくバイトを転送します。カーソル移動キーなどのファンクションキーは、エスケープシーケンス(エスケープ文字ESC、つまり\e0x1b \033、^ [で始まる)に変換されます。ファンクションキーまたは文字キーと修飾子の組み合わせも同様です。しかし、すべての端末がすべての異なる修飾子の組み合わせに対して異なるシーケンスを送信するわけではありません。一部のキーは制御文字でエンコードされます(例:Tab→Ctrl-I == \t\011

ご覧のとおり、制御文字を説明する方法はいくつかあります。一部には、既存の機能(タブ、改行など)に対応する名前があり、$'…'内部的にもパラメータで使用できるバックスラッシュ+文字の組み合わせを持つ傾向があります。echoまたはprint(awk、C、および他の言語のsed正規表現と文字列リテラルも含まれます(他のツールにはわずかに異なるエスケープシーケンスセットがある可能性があります))。\033これらのコンテキストでは、バックスラッシュ+ 8進数(たとえば)を使用することもできます。

キーごとに送信されるエスケープシーケンス端末にはいくつかのバリエーションがあります。幸いなことに、重なる部分はほとんどありません。異なる端末で異なるキーを表す文字列はほとんどない。主な問題は、文字127 == \1770x7fです。最近最も一般的Backspaceですが、時にはDelete

^[OFおよび^[[F(つまり、および\eOF\e[Fは、送信される2つの共通エスケープシーケンスですEnd^E(つまり\005)はEmacsキーバインディング(Ctrl+ E)ですend-of-line

ターミナルエミュレータが特定のキーまたはキーの組み合わせについて送信する内容を表示するには、Ctrl+を押してからV関連キーを押します。文字通りエスケープシーケンスの最初の文字を挿入します。エスケープシーケンスは通常エスケープ文字と印刷可能文字で構成されるため、エスケープシーケンスの残りの部分も文字通り挿入されます。

Terminfoデータベースには、特定のキーのエスケープシーケンスが含まれています。 Terminfo 機能のリストは以下にあります。用語情報(5)システムのマニュアルページ。 zshでは、次のようにデータベースの値を一覧表示できます。terminfo連想配列。エスケープシーケンスが含まれている値を印刷すると、これらのエスケープシーケンスは表示時に端末でも解釈されるため、引用形式で印刷されることに注意してください。

% print -lr ${(q)terminfo[kend]}
$'\033'OF

バラよりキーボード入力とテキスト出力はどのように機能しますか?キーを押したときに何が起こるのかをより完全に理解してください。 zshのキーバインディングについて知る必要はありません。

おすすめ記事