特定のキーボードショートカットの文字シーケンスを取得するには、showkey -a
そのまま(Ctrl+ V)を使用または挿入します。
その逆は何ですか?人間が読める形式の文字シーケンスからキーボードショートカットを取得するには?
たとえば、いくつかのキーバインディングを使用しました。
^[^?
^X^U
^[[3;5~
^[[1;2D
^[[1;2C
^[[1;5C
^[[1;5D
^[[1;6C
^[[1;6D
....
今、どのキー/キーの組み合わせを使用したか覚えていません。
どうやって見つけることができますか?
アップデート1
私は人が読める形式でなどを出力できるものを探していCtrl+R
ます。Ctrl+Delete
可能な文字シーケンスと人間が読める形式を含むテーブルへの参照も問題ありません。
答え1
最初の数行
^[^?
^X^U
ASCII コントロールとしてリストされたコードを見つけることができます。
^[ (escape)
^U (control-U)
^X (control-X)
それ^?
ASCII DELの正規表現です(削除キー)。
端末の説明(TERM
)が正しく設定されている場合、
infocmp -1 -x
キーのncurses名はterminfo形式で印刷されます。追加情報がありますが、次の行が表示されます。
kDC5=\E[3;5~,
kRIT=\E[1;2C,
kRIT3=\E[1;3C,
kRIT4=\E[1;4C,
kRIT5=\E[1;5C,
kRIT6=\E[1;6C,
kRIT7=\E[1;7C,
kLFT=\E[1;2D,
kLFT3=\E[1;3D,
kLFT4=\E[1;4D,
kLFT5=\E[1;5D,
kLFT6=\E[1;6D,
kLFT7=\E[1;7D,
どこに(与えられた用語について\E
ASCIIエスケープ済み^[
)あなたの例に該当すると考えることができます。これkLFT
そしてkRIT
名前を見ると、何が何であるかがわかります(xterm-style)。修正済み左/右カーソルキー(参照XTerm制御シーケンス名前の後の数字の意味については、コード/修飾子の表を参照してください。 terminfo 名は以下にリストされています。端末データベース:
# These are the extended keys defined in this file:
#
# kDC3 kDC4 kDC5 kDC6 kDC7 kDN kDN3 kDN4 kDN5 kDN6 kDN7 kEND3 kEND4 kEND5 kEND6
# kEND7 kHOM3 kHOM4 kHOM5 kHOM6 kHOM7 kIC3 kIC4 kIC5 kIC6 kIC7 kLFT3 kLFT4
# kLFT5 kLFT6 kLFT7 kNXT3 kNXT4 kNXT5 kNXT6 kNXT7 kPRV3 kPRV4 kPRV5 kPRV6 kPRV7
# kRIT3 kRIT4 kRIT5 kRIT6 kRIT7 kUP kUP3 kUP4 kUP5 kUP6 kUP7 ka2 kb1 kb3 kc2
で説明されています。user_caps
マンページ。
これらすべてを念頭に置いて、誰かが次を示すテーブルを作成するプログラムやスクリプトを作成できますか?読める形式(しかし、記録された場所を知ることは役に立ちます)。
^[^?
一部の端末では、を押すとこの情報が送信されますAltDelete(ただし、端末の説明にはありません)。これは^X^U
、ターミナルエミュレータでシングルキー押下によって送信されるシーケンスではありません(バウンスキー押下がない限り)。 2回のキー押下である可能性が高いです。
答え2
端末がECMA-48形式、DECFNK、Interix、SCOコンソール、またはUnicode RXVT形式で入力制御シーケンスを生成する限り、これを私のconsole-decode-ecma48
ツールに提供し、--input
コマンドラインオプションを使用して文字ストリームが入力ではなく入力であることを通知できます。出力。これは、今日実際に接しているほとんどの端末と端末エミュレータに当てはまります。
入力内容は以下の通りです。^[
もちろん、実際の文字に置き換えられます。␛
%コンソールのデコード -ecma48 --input << EOF ^[^? ^X^U ^[[3;5~ ^[[1;2D ^[[1;2C ^[[1;5C ^[[1;5D ^[[1;6C ^[[1;6D EOF デル もし U+00000015 もし DEC制御+削除 もし レベル2+CUB 1 もし レベル2+CUF 1 もし コントロール+CUF 1 もし コントロール+カップ1 もし コントロール+レベル2+CUF 1 もし コントロール+レベル2+CUB 1 もし %
記載されているようにhttps://unix.stackexchange.com/a/504056/5132⎇ Alt、キーコードの一部の端末操作をデコードするには返品この--no-7bit
オプションは必須です。それ以外の場合は、C1制御文字の7ビットエイリアスのECMA-48標準デコードが得られます。
CUF
CUB
もちろん、標準のECMA-48名です。CURSORFこれから」と「CURSOR第二不器用". マニュアルを参照してください。
端末制御シーケンスの規則はあなたを驚かせるかもしれません。␛
、DEL、␊
および␘
を入力しました␕
。端末制御シーケンスの規則は次のとおりです。
␛
エスケープシーケンスを開始します。- DEL は制御文字として直ちに処理されますが、エスケープ・シーケンスはまだ保留中です。
␊
制御文字としてすぐに処理されますが、エスケープシーケンスはまだ保留中です。- 保留中のエスケープシーケンスをキャンセルします
␘
(名前にあります)。 ␕
C0制御文字として扱われます。console-decode-ecma48
その特定の文字のUnicodeコードポイントを印刷します。
私が知っている限り、実際に正しいECMA-48デコーダを含むシェルはありません。シェルはパターンマッチングを実行します。これは、端末が常に送信する実際のECMA-48エンコーディングコンテンツを処理するのにかなり不完全です。これにより、以下に説明するような問題が発生する可能性があります。https://unix.stackexchange.com/a/499139/5132そしてhttps://unix.stackexchange.com/a/520429/5132など。
console-decode-ecma48
実際、SCOコンソール、Interixなどとは異なり、制御シーケンスステートマシンを備えた適切なECMA-48デコーダがあります。それはあなたに見せません。正確にGNU Readline、libedit、ZLEなどの操作が入力に対して行われる操作は、正しいプロトコルが得られないことです。
しかしそれは〜するECMA-48端末が送信中であると思う内容、つまり、正確にユーザーが望む内容を表示します。
追加読書
- ジョナサンデボインポラード(2018)。 」
console-decode-ecma48
」。 スナックガイド。ソフトウェア。
答え3
特定のキー(またはキーの組み合わせ)を押すと端末が送信する文字または文字のシーケンスは、端末自体によって異なります。
a
準汎用ですが、キーをA 押すとすべての端末が送信されますが(少なくともそのような鍵がある端末の場合)、またはHome+Leftなどの鍵の場合は端末によって大きく異なります。F1Ctrl6
しかし、いくつかの共通点があります。値が0から31までのASCII制御文字は、通常、... 、、、、、^@
で^A
表されます。これらすべてに対して印刷可能文字のビット6を切り替えると、対応する制御文字(0x1、0x41など)が得られます。 0x7f、0x3fです。^Z
^[
^\
]
^^
^_
A
^A
^?
?
^X
+を押すとCtrl端末から文字が送信されますX。
^I
TabTAB制御文字で、制御文字(Ctrl+を除く)のあるIキーを押すときも送信されます。
^[
、別名、キー\e
とEsc同じです。
^H
\b
バックスペース文字とも呼ばれますが、一部の端末ではDEL
(^?
)を送信し、Backspace他の端末では送信しません^H
。
^M
akaは\r
Return / Enter時に送信されます(ただし、一部のモードではターミナルデバイスドライバによってakaに変換できます^J
)。\n
^@
AKAは\0
+で送ることもできますが、時々+で送ることもできます。Ctrl@CtrlSpace
一部の端末には、他のキーと組み合わせるとビット8が設定されているのと同じ文字を送信するか、修飾キーがありますMeta(たとえば、+(なし)は0x61からバイト0xE1を送信します)。他のものは(今はより一般的です)文字の後に送信された文字または文字シーケンスを送信します(例:+ send)。AltMetaAShifta
^[
MetaMetaA^[a
他のほとんどのファンクションキーは、通常(ESC)で始まる一連の文字を送信します^[
。 1つの例外は、Delete一部の端末でDEL()を送信することです^?
。
キーボード入力を処理するターミナルアプリケーションは、ターミナルデバイスから一連の文字を受け取るときに対応するキーを押すことを知りたいと思います。異なる端末が異なるシーケンスを送信した場合はどうなりますか?
ここでは$TERM
環境変数が機能します。この変数は、getty
端末エミュレーターまたはユーザーがアプリケーションに通信している端末を通知するために設定されます。値は、端末タイプを一意に識別する短い名前です。
たとえば、最新のxterm
端末エミュレータではこれをxterm-256color
。
その後、これらのアプリケーションはこの値を使用して端末記述データベースを照会し、端末機能について学ぶことができます。たとえば、次の機能があります。文字の順序は何でなければなりませんか?送る端末で有効勇敢なテキスト出力。他のものは、アプリケーションが使用する一連の文字です。受け取るこのキーを押すと端末からDelete。
歴史的には2つの基本データベースがあり、それぞれtermcap
にterminfo
クエリ用のAPIセットがありました。最近ではterminfo
(より進化した)ものが一般的でありncurses
(作られた)@トーマスディキ過去数十年にわたって)は相互作用のためのユニバーサルライブラリです(同じバックエンドを使用してtermcapインターフェースも公開しています)。
今可能なセット能力このデータベースのリポジトリは固定されています。terminfo(5)
マンページに記載されています。
キーの前面には限られた数のキーがあります。私たちのほとんどが聞いたことのないキーを含むまだ大きなリストですが、過去と将来のすべての可能な端末のすべてのファンクションキーを含むわけではありません。いくつかのキーの組み合わせ(主にShift+)を扱いますが、可能なSomeFuncKeysすべての組み合わせ(例:Ctrl+ Shift+ Up)を扱うわけではありません。
GNUシステムでは、以下を参照してください。
man 5 terminfo | grep -Po '^\s*\Kkey_.*'
リストのため。
シェルからデータベースを照会するには、terminfo
次の3つの主要なコマンドがありますncurses
。
toe
: データベースの端末のリストtput
:元の関数を印刷します。 (通常はエスケープシーケンスを送信するために使用されます。例:tput bold
start勇敢なモデル)。infocmp
:データベース内のエントリ全体を検索または比較します。
ここでは、後者は、どの端末キーが与えられたシーケンスを送信できるかを調べるのに役立ちます。infocmp -xL1
言い換えれば、1行あたりおよびong(より説明的な)関数名と共に格納された端末(したがって端末)のすべての既知の機能の出力識別子です。だから:$TERM
1
L
$ infocmp -xL1 | grep key_
key_b2=\EOE,
key_backspace=\177,
key_btab=\E[Z,
key_dc=\E[3~,
key_down=\EOB,
key_end=\EOF,
key_enter=\EOM,
[...]
既知のすべてのキーのすべてのシーケンスを提供します。
私のxterm
端末には以下が表示されます。
key_sright=\E[1;2C,
key_sleft=\E[1;2D,
例えば。
シェルはまた、特別な連想配列zsh
(対応する変数にアクセスしたときに自動的にロードされるモジュール)に現在の端末の機能を公開します。したがって、情報を取得する別の方法は次のとおりです。$terminfo
zsh/terminfo
$ key=$'\e[1;2D'
$ echo ${(k)terminfo[(Re)$key]}
kLFT
(これは短いterminfo名があります)。
terminfoデータベースは私の端末に送信されたキーをリストしませんが、たとえば、+、+、または+ +を入力すると^[^?
そのシーケンスが取得されます。Esc Ctrl?Ctrl[ ?AltCtrl?
おそらくあなたの端末^?
がに送信しているかもしれません、または+にそれを受信するDeleteかもしれません。MetaDelete
^X^U
CtrlX Ctrl++に送信する予定Uの場合、端末にその機能を送信する機能キーがあるとは想像できませんが、多くの端末エミュレータはすべての文字シーケンスをすべてのキーまたはキーの組み合わせにバインドできます。
1端末は入力時に特定のファンクションキーに対して異なるシーケンスを送信できるため、多くの端末には追加の注意があります。キーボード適用モードそしてそうでないとき。この場合、terminfoエントリは次のことを説明します。キーボード適用モード。アプリケーションは、この関数に対応するシーケンスを送信して端末をこのモードに切り替えることができますsmkx
。
答え4
強く打つ
$ bind -p | grep -F '[3;5~'
"\e[3;5~": delete-char