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

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

さまざまなキー入力をすべて変換するキーバインディングテーブルはありますか?私は使用していますが、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のキーバインディングについて知る必要はありません。

答え2

    BEGINNER'S GUIDE TO ZSH KEYBOARD ASSIGNMENTS, AKA 'KEYBOARD BINDINGS'.

(コメント、改善、深刻な非難を歓迎します:eastlink dot caのrayandrews)

「101」PCのキーボードでは、「使用可能な」キーの組み合わせは、Debian Linuxのxfce4で「zsh」を実行しているPCに接続されています(「責任」が誰なのかわかりません)。表示された最も単純なアバターを除いて、「グレー」キー内で重複コードを生成するすべての組み合わせが削除されました。一部の灰色のキー/組み合わせには、 "Enter" == "^M"などの "^letter"重複エントリがありますが、まだ削除されていません。他のアクティブな組み合わせは、例えばコンソールでもシステムで使用されているので、もはや「使用可能」ではない。 「Alt+Function」キーは端末を切り替えます。 「Meta」キーはさらに多くの操作を実行できますが、101KBです。興味深いことに、Ctrl + Functionなど、DOSにはより多くの組み合わせがあります。この組み合わせはすべてDOSで使用できますが、Linuxでは使用できないようです。トリプルキーの組み合わせ(「Ctrl + Alt + Up」など)はグレーキーに一意のコードを生成しませんが、白いキーにはコードを生成します。興味深い例外: "^[[22"" "^[[27"" "^[[30""がありません。なぜこの数字をスキップするのか疑問に思います。 (つまり、「F11」は「^[[23」ではなく、「^[[22」」になると予想できます。)

表示されるキーコードは、CLIの「showkeys -a」または「bindkey」出力と同じです。ただし、何らかの理由でスクリプトで "bindkey" を使用する場合 (".zshrc" のように) "^[" は "\e" に置き換える必要があるため、CLI では次のようになります。

バインドキー -s '^[[[A' '私のコマンド\Cm'

...「F1」を「my-command」にバインドして実行します(「\ Cm」は「Enter」キーをシミュレートします)。

".zshrc"から:

findkey -s '\e[25' '私のコマンド1;私のコマンド2 \Cm'

...「Shift-F1」を「my-command1」にバインドし、次に「my-command2」にバインドして実行します。

「グレー」キーの組み合わせのみを使用してください。

キー[F1] = '^[[[A'] キー[F2] = '^[[[B'] キー[F3] = '^[[[C'] キー[F4] = '^[[[D'] キー[F5] = '^[[[E'] キー[F6] = '^[[17~'] キー[F7] = '^[[18~'] キー[F8] = '^[[19~'] キー[F9] = '^[[20~'] キー[F10] = '^[[21~'] キー[F11] = '^[[23~'] キー[F12] = '^[[24~']

キー [Shift-F1] = '^[[25~'] キー [Shift-F2] = '^[[26~'] キー [Shift-F3] = '^[[28~'] キー [Shift-F4] = '^[[29~'] キー [Shift-F5] = '^[[31~'] キー [Shift-F6] = '^[[32~'] キー [Shift-F7] = '^[[33~'] キー [Shift-F8] = '^[[34~']

キー[挿入] = '^[[2~'] キー[削除] = '^[[3~' キー[ホーム] = '^[[1~'] キー[終了] = '^[[4~'] キー[前のページ] = '^[[5~'] キー[PageDown] = '^[[6~'] キー[上] = '^[[A'] キー[下] = '^[[B'] キー[右] = '^[[C'] キー[左] = '^[[D']

キー[Bksp] = '^?' キー[Bksp-Alt] = '^[^?' key[Bksp-Ctrl] = '^H' コンソールのみ。

キー[Esc] = '^[' キー[Esc-Alt] = '^[^['

キー[Enter] = '^M' キー[Enter-Alt] = '^[^M'

key[Tab] = '^I' または '\t' 一意の形式です。バインドできますが、「showkey -a」は使用できません。 キー[Tab-Alt] = '^[\t'

白いキーの組み合わせを使用してください。

異常な状況: xterm では 'Ctrl+`' == 'Ctrl+2' および 'Ctrl+1' == '1' です。 一部の「Ctrl + Number」の組み合わせはコンソールでは機能しませんが、xtermはコードを返します。 OTOH Ctrl + Bkspはコンソールから "^ H"を返しますが、xtermの通常の "Bksp"と同じです。ただし、間違いなくこれらの欠陥にはより多くの欠陥があり、主な欠陥は次のとおりです。

白いキーコードはわかりやすいです。各「一般」印刷キーには6つの形式があります。

A = 'a' (不意の音) A-Shift = 'A'(誰が推測できますか?) A-Alt = '^[a']
A-Ctrl = '^A' A-Alt-Ctrl = '^[^A' A-Alt-Shift = '^[A' A-Ctrl-Shift = '^A' (Shift は効果がありません)

忘れないでください。

/-Shift-Ctrl=Bksp='^?' [-Ctrl = Esc = '^[' M-Ctrl=Enter='^M'

さらに、キーバインディングを「スタック」することもできます。

binkey -s '^Xm' "私の女主人の目は太陽と全く異なります。"

...「Ctrl-X」の後に「m」と入力して美しい詩を作成します。

私たちは狂ったように追いかけを投げることができます:

binkey -s '^Pletmenot' 'しないで、誠実な結婚'

...しかし、「修飾子」文字でそのような作業を始める必要があります。一度試してみてください。キーボードショートカットが気に入ったら、本当にダウンタウンに行くことができます。

質問:

「Ctrl-Bksp」がコンソールにあるものとxtermのものが違うとどこに記録されていますか?

これらのタスクを変更できますか?

これらすべてを誰がデザインし、当時彼らは何を考えていましたか?

端末を変更するために「Alt-Function」を使用する理由存在する端末ですが、「Alt-Ctrl-Function」で変更できます。到着GUI用端末?

「Alt-Ctrl-Delete」はどのように/どこで定義されますか?

enter code here

答え3

Unix/Linux には多くのツールがあるため、多少混乱し、負担がかかる場合があります。まず、次を使用しますshowkey

$ showkey -a

Press any keys - Ctrl-D will terminate this program

a    97 0141 0x61
b    98 0142 0x62
c    99 0143 0x63
d   100 0144 0x64
e   101 0145 0x65
f   102 0146 0x66
g   103 0147 0x67

マニュアルページから-a

   When  in  `ascii' dump mode, showkey prints to the standard output the 
   decimal, octal, and hexadecimal value(s) of the key pressed,
   according to he present keymap.

以下を使用していくつかのマッピングを取得できますxmodmap

$ xmodmap
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x42)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

上記は完全なパズルではありませんが、キーバインディングとスキャンコード間の最終マッピングを見つけるのに役立つ可能性があるいくつかの追加情報です。詳細はこのU&L Q&Aに含まれています。Linuxのキーマッピング

引用する

答え4

URxvt 端末エミュレータを使用します。これらのコードを表示する便利なキーバインディングがありますCtrl+V。目的のキーシーケンスを押してから入力すると、対応するコードが印刷されます。たとえば、私のCtrl+にはコードがあります^[Oa

関連情報