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


18

キープレスを参照するさまざまな方法をすべて変換するキーバインディングテーブルはありますか?私はを使用し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

...しかし、少なくとも今で ^[[Aは、bindkey-at-CLIで話すことは\e[Abindkey-in-zbindkeyで話すことと同じことを知っています。それは簡単です。DOSの古い時代には、Up Arrow だった0;72-あなたはすべての法的なキーストロークのスキャンコードを見つけることができる、唯一の言語がありました。

テーブルはありますか?または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

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


3
Ctrl + V(または何でもstty -aいいlnext)を押してからキーを押します。
ミケル14

回答:


15

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

ご覧のとおり、制御文字を記述する方法はたくさんあります。一部には、従来の機能(タブ、改行など)に対応する名前が付いています。これらは、あなたが内部で使用することができますバックスラッシュ+文字の組み合わせ持っている傾向がある$'…'に引数または中echoまたはprint異なるツールがわずかに異なるセットを持っていることだけでなく、sedの正規表現にし、AWK、Cおよび他の言語(ノートの文字列リテラル中の(エスケープシーケンスの))。\033これらのコンテキストでもバックスラッシュ+オクタル(例:)を使用できます。

各エスケープシーケンスターミナルが送信するキーには、いくつかのバリエーションがあります。幸い、オーバーラップはほとんどありません。異なる端末上の異なるキーを意味する文字シーケンスはほとんどありません。主な問題は、文字127 =で\177あることが最も多い= 0x7fのBackspace頃は、時にはDelete

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

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

Terminfoデータベースには、いくつかのキーのエスケープシーケンスが含まれています。Terminfo機能のリストは、システムのterminfo(5)のマニュアルページにあります。zshでは、terminfo連想配列を介してデータベースの値をリストできます。値が表示されるときに端末によって解釈されるエスケープシーケンスを含む値を出力するときは、引用符で囲まれた形式で出力することに注意してください。

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

キーボード入力とテキスト出力の仕組みをご覧くださいキーを押したときに起こることのより完全な概要については。zshのキーバインディングを理解する必要はありません。


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

(コメント、改善、苦い非難は歓迎:eastlink dot caのrayandrews)

Debian Linuxでxfce4の下で 'zsh'を実行しているPCに接続された '101' PCキーボードの 'Available'キーの組み合わせ(だれが「担当」しているかわかりません)。「グレー」キー内で重複コードを生成するすべての組み合わせは、表示されている最も単純なアバターを除いて削除されています。いくつかの灰色のキー/組み合わせには、「Enter」==「^ M」のように「^ letter」の重複があることに注意してください。これらは削除されていません。他のアクティブな組み合わせは、たとえばコンソールからでもシステムによって使用されるため、「使用可能」ではありませんでした。「Alt + Function」キーでターミナルを切り替えます。おそらく、「メタ」キーはもっと多くのことをしますが、これは101 KBです。興味深いのは、Ctrl + Functionなど、DOSで使用可能な組み合わせがはるかに多いことです。DOSではすべて使用できますが、Linuxでは使用できません。トリプルキーの組み合わせ(例: 'Ctrl + Alt + Up')は、グレーキー内に一意のコードを生成しませんでしたが、ホワイトキーにコードを生成します。興味深い異常: '^ [[22' '^ [[27' '^ [[30'は「欠落」しているのに、なぜこれらの数値がスキップされたのか疑問に思うでしょう。(つまり、「F11」は「^ [[23」ではなく、「^ [[22」であると予想されるかもしれません。)

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

bindkey -s '^ [[[A' 'my-command \ Cm'

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

「.zshrc」内:

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

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

「グレイ」キーだけを使用した組み合わせ

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

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

key [ Insert ] = '^ [[2〜' key [ Delete ] = '^ [[3〜' key [ Home ] = '^ [[1〜' key [ End ] = '^ [[4〜' key [ PageUp ] = '^ [[5〜' キー[ PageDown ] = '^ [[6〜' キー[ Up ] = '^ [[A' キー[ Down ] = '^ [[B' キー[ Right ] = '^[[C' key[Left] = '^[[D'

key[Bksp] = '^?' key[Bksp-Alt] = '^[^?' key[Bksp-Ctrl] = '^H' console only.

key[Esc] = '^[' key[Esc-Alt] = '^[^['

key[Enter] = '^M' key[Enter-Alt] = '^[^M'

key[Tab] = '^I' or '\t' unique form! can be bound, but does not 'showkey -a'. key[Tab-Alt] = '^[\t'

COMBINATIONS USING THE WHITE KEYS:

Anomalies: 'Ctrl+`' == 'Ctrl+2', and 'Ctrl+1' == '1' in xterm. Several 'Ctrl+number' combinations are void at console, but return codes in xterm. OTOH Ctrl+Bksp returns '^H' at console, but is identical to plain 'Bksp' in xterm. There are no doubt more of these little glitches however, in the main:

White key codes are easy to undertand, each of these 'normal' printing keys has six forms:

A = 'a' (duhhh) A-Shift = 'A' (who would have guessed?) A-Alt = '^[a'
A-Ctrl = '^A' A-Alt-Ctrl = '^[^A' A-Alt-Shift = '^[A' A-Ctrl-Shift = '^A' (Shift has no effect)

Don't forget that:

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

And, we can 'stack' keybindings:

bindkey -s '^Xm' "My mistress\' eyes are nothing like the sun."

... Bind 'Ctrl-X' followed by 'm' to a nice line of poetry.

And we can flirt with madness:

bindkey -s '^Pletmenot' 'Let me not, to the marriage of true minds'

... but you hafta start something like that with a 'modifier' character. Try it, if you like keyboard shortcuts, you can really go to town.

QUESTIONS:

Where is it written that 'Ctrl-Bksp' means one thing at console, another thing in xterm?

Are these assignments changable?

Who designed all this, and what were they thinking at the time?

Why is it 'Alt-Function' to change terminals at a terminal, but 'Alt-Ctrl-Function' to change to a terminal from GUI?

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

enter code here

私はほとんど...電子メールを送信したい
mikeserv

どうしてもマイク:rayandrews@eastlink.ca
レイアンドリュース

それは冗談でした、レイ-あなたはしばしば愚痴、不満、苦情を見ませんか?私にメールしてください。ありがたいです。とにかく、zshキーのトピックについてzkbdは、ファイルに保存されたキーマッピング全体を取得する機能を試してみてください。私はそれがautoloadできると信じていますが、そうでない場合は、で探してください/usr/share/zsh/functions/Misc。ちなみに、そこには他にも奇妙なものがいくつかありtetrisます。
mikeserv 14年

それは私がテーブルを作るのに使ったツールの1つですが、どのようにしてそれを一度に「すべて」を誇示するのですか?
レイアンドリュース14年

興味深い-私はしなかったと思います。今まで実際に実行したことはありません-そのソースファイルを読み取るだけです-それは数か月前でした。一連の入力テストを行って、保存ファイルを生成すると思います。しかし、すべてをファイルに保存しますか?
mikeserv 14年

6

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

以下に関するmanページから-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でのキーマッピング」というタイトルの詳細情報があります。

参照資料


1
これはすべて真実ですが、端末でのキーバインディングの理解とは無関係です。
ジル 'SO-悪であるのをやめる' 14

@Gilles-ええ、私はあなたのAIがそのインターフェースがどのように機能するかを理解したので、リードを提供しようとしているだけだと思いました、ありがとう!
slm

ただし、「showkey -a」は無関係ではありません。
skagedal

2

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

bindkey "Home" beginning-of-line

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

エントリinfocmpを記述するためのユーティリティがありterminfoます。これは、-Lオプション(別名長い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

エスケープに異なる表記法を使用していることがわかりますが、基本的に、の2番目の列infocmpとの最初の列を接続するスクリプトを書くのは比較的簡単ですbindkey

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

key_send  ->  shifted end key
key_sic   ->  shifted insert-character key
key_dc    ->  delete-character key
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.