web-dev-qa-db-ja.com

キー割り当てテーブル?

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

私が尋ねる理由は、いくつかのキー割り当てを割り当てたいので、それらを参照する方法を知る方法がないためです(既に定義されているものを盗むつもりでない限り)。

たとえば、「zbindkey」には次のようなものがあります。

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

...そして「ケンド」はこれが End キー。

bindkeyとのクロスチェック次の行が表示されます。

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

...したがって、これらの行の1つが End キー。どれ?

これは「bindkey」ファイルにもあります。

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

今、私はそれが Up Arrow キーですが、知らない場合はどうすればわかりますか?

$ bindkey (at CLI)

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

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

...しかし、少なくとも今では、bindkey-at-CLIの^[[Aはbindkey-in-zbindkeyの\e[Aと同じことを知っています。簡単だ。 DOSの昔は、 Up Arrow0;72でした-すべての有効なキーストロークのスキャンコードを見つけることができ、言語は1つしかありませんでした。

テーブルはありますか?または、キーストロークを選択し、それをterminfo[]で参照する方法を知ることができる他の方法: "bindkey-in-zbindkey" ... "bindkey-at-CLI"および/または他にどんな言語があるのでしょうか?

ここでも、DOSにはscancodeプログラムがありました。キーストロークを入力すると、スキャンコードが取得されます。それは罪深いほど簡単でした。


答えから、すべての可能なバインディングの表を印刷する方法はないと思いますか?とにかく '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

...それで私は幸せになります。

20
Ray Andrews

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

ご覧のとおり、制御文字を説明するには多くの方法があります。一部には、従来の機能に対応する名前があります(例:タブ、改行)。これらは、$'…'内、または echo またはprintへの引数(およびsed正規表現や文字列)で使用できるバックスラッシュ+文字の組み合わせを持つ傾向がありますawk、C、およびその他の言語のリテラル(ツールごとにエスケープシーケンスのセットが若干異なる場合があることに注意してください)。これらのコンテキストでは、バックスラッシュ+ 8進数(例:\033)も使用できます。

各キーに対してどのエスケープシーケンス端末が送信するかについては、いくつかのバリエーションがあります。幸い、ほとんど重複はありません。異なる端末で異なるキーを意味する文字シーケンスはほとんどありません。主な問題は、文字127 = \177 = 0x7fであり、これは最も頻繁に発生します Backspace 最近では時々 Delete

^[OFおよび^[[F(つまり、\eOFおよび\e[F)は、によって送信される2つの一般的なエスケープシーケンスです。 End^E(つまり、\005)はEmacsのキーバインディング(Ctrl+Eend-of-lineの場合。

端末エミュレータが特定のキーまたはキーの組み合わせに対して何を送信するかを確認するには、 Ctrl+V そして問題の鍵。これにより、エスケープシーケンスの最初の文字がそのまま挿入されます。エスケープシーケンスは通常、エスケープ文字とそれに続く印刷可能な文字で構成されているため、残りのエスケープシーケンスも文字通り挿入されます。

Terminfoデータベースには、一部のキーのエスケープシーケンスが含まれています。システムの terminfo(5) manページに、Terminfo機能のリストがあります。 zshでは、 terminfo 連想配列を使用してデータベースの値をリストできます。表示時に端末でも解釈されるエスケープシーケンスが含まれている値を出力するときは注意してください。引用符付きの形式で出力してください。

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

キーを押したときの動作の詳細については、 キーボード入力とテキスト出力の仕組み を参照してください。 zshのキーバインディングを理解する必要はありません。

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

(コメント、改善、苦い非難を歓迎:イーストリンクドットカリフォルニアのレイアンドリュース)

Debian Linuxのxfce4で「zsh」を実行しているPCに接続された「101」PCキーボードの「利用可能な」キーの組み合わせ(誰が「責任者」なのかわかりません)。表示されている最も単純なアバターを除いて、「灰色」のキー内で重複したコードを生成するすべての組み合わせが削除されました。 「Enter」==「^ M」のように、一部の灰色のキー/組み合わせには「^ letter」の重複があることに注意してください。これらは削除されていません。他のアクティブな組み合わせは、システムから使用されたため、コンソールなどからでも使用できませんでした。 「Alt +ファンクション」キーで端子を切り替えます。おそらく「メタ」キーでさらに多くのことができますが、これは101 KBです。興味深いのは、Ctrl + Functionなど、DOSで利用できる組み合わせがはるかに多いことです。すべてDOSで利用できますが、Linuxでは利用できないため、そうです。トリプルキーの組み合わせ(例:Ctrl + Alt + Up)では、灰色のキー内に一意のコードは生成されませんでしたが、白いキーにコードが生成されました。興味深い異常: '^ [[22' '^ [[27' '^ [[30' are 'missing'、あなたはそれらの数字がスキップされた理由を不思議に思っています。 (これは、 'F11'が '^ [[23'ではなく '^ [[22'であると期待するかもしれないと言うことです。)

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

bindkey -s '^ [[[A' 'my-command\C-m'

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

'.zshrc'内:

bindkey -s '\ e [25' 'my-command1;私のcommand2\C-m '

... 'Shift-F1'を 'my-command1'にバインドし、その後に 'my-command2'をバインドして、両方を実行します。


「グレイ」キーだけを使用した組み合わせ:
key [F1] = '^ [[[A' key [F2] = '^ [[[B' key [F3] = '^ [[[C' key [F4] = '^ [[[D' key [F5] = '^ [[[E' key [F6] = '^ [[17〜' key [F7] = '^ [[18〜' key [F8] = '^ [[19〜' key [F9] = '^ [[20〜' キー[F10] = '^ [[21〜' キー[F11] = '^ [[23〜' キー[F12] = '^ [[24〜'
key [Shift-F1] = '^ [[25〜' key [Shift-F2] = '^ [[26〜' key [Shift-F3] = '^ [[28 〜 ' キー[Shift-F4] =' ^ [[29〜 ' キー[Shift-F5] =' ^ [[31〜 ' キー[Shift-F6 ] = '^ [[32〜' key [Shift-F7] = '^ [[33〜' key [Shift-F8] = '^ [[34〜'
key [Insert] = '^ [[2〜' key [Delete] = '^ [[3〜' key [Home] = '^ [[1〜' key [End] = '^ [[4〜' key [PageUp] = '^ [[5〜' key [PageDown] = '^ [[6〜' key [Up] = '^ [[A' key [Down] = '^ [[B' key [Right] = '^ [[C' key [左] = '^ [[D'
key [Bksp] = '^?' key [Bksp-Alt] = '^ [^?' key [Bksp-Ctrl] = '^ H'コンソールのみ。
key [Esc] = '^ [' key [Esc-Alt] = '^ [^ ['
key [Enter] = '^ M' key [Enter-Alt] = '^ [^ M'
key [Tab] = '^ I'または '\ t'ユニークな形式!バインドできますが、 'showkey -a'はできません。 key [Tab-Alt] = '^ [\ t'
ホワイトキーを使用した組み合わせ:
異常: 'Ctrl + `' == 'Ctrl + 2'、および 'Ctrl + 1' == '1' in xterm。 いくつかの 'Ctrl + number'の組み合わせはコンソールでは無効です。ただし、xtermの戻りコード。 OTOH Ctrl + Bkspはコンソールで「^ H」を返しますが、xtermのプレーンな「Bksp」と同じです。しかし、これらの小さな不具合の多くは、間違いなく間違いありません。
白いキーコードは簡単にわかりやすく、これらの「通常の」印刷キーにはそれぞれ6つの形式があります。
A = 'a'(duhhh) 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'
そして、キーバインドを「スタック」することができます:
bindkey -s '^ Xm'「私の愛人\」の目は太陽のようなものではありません。
... 'Ctrl-X'に続いて 'm'を詩の素敵な行にバインドします。
そして、私たちは狂気で浮気することができます:
bindkey -s '^ Pletmenot' 'Let me not、to the marriage of the true minds'
...しかし、「モディファイア」文字でそのような何かを開始する必要があります。ぜひお試しください。キーボードショートカットがお好みなら、街に行くことができます。
質問:
「Ctrl-Bksp」はコンソールでは1つのことを意味し、xtermでは別のことを意味すると書かれていますか?
これらの割り当ては変更可能ですか?
誰がこれをすべて設計し、彼らは当時何を考えていましたか?
端末を変更するには「Alt-Function」at端末ですが、GUIから「to」を変更するには「Alt-Ctrl-Function」を使用するのはなぜですか?
「Alt-Ctrl-Delete」はどのように/どこで定義されていますか? enter code here
11
Ray Andrews

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に関するmanページから:

   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のキーマッピング

参考文献

6
slm

キーグリフを「通常の」用語に変換する方法がいくつかある場合:

bindkey "Home" beginning-of-line

...それで私は幸せになります。

infocmpエントリを記述するためのterminfoユーティリティがあります。これは特に-Lオプションaka 長いC変数名

$ infocmp -cL
...
key_home= '\EOH'.
key_up= '\EOA'.
key_down= '\EOB'.
key_right= '\EOC'.
key_left= '\EOD'.
key_backspace= '^H'.
key_end= '\EOF'.
...

これをbindkey出力と比較する

"^[OH" beginning-of-line
"^[OA" up-line-or-history
"^[OB" down-line-or-history
"^[OC" forward-char
"^[OD" backward-char
"^H" backward-delete-char
"^[OE" end-of-line

escapeの表記が異なることがわかりますが、基本的には、infocmpの2番目の列を最初のbindkeyに接続するスクリプトを書くのは比較的簡単です。

特定の文字列の意味に疑問がある場合(infocmp出力に出力されるように)、完全な説明が記載されているterminfoマニュアルをいつでも確認できます。たとえば、

key_send  ->  shifted end key
key_sic   ->  shifted insert-character key
key_dc    ->  delete-character key
3
jimmij

URxvtターミナルエミュレータを使用しています。このようなコードを表示するための便利なキーバインディングがあります:Ctrl+V。それを押した後、必要なキーシーケンスを入力すると、そのコードが印刷されます。たとえば、私のCtrl + にはコード^[Oa

0
poulix