追加読書

追加読書

特定のキーボードショートカットの文字シーケンスを取得するには、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,

どこに(与えられた用語について\EASCIIエスケープ済み^[)あなたの例に該当すると考えることができます。これ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標準デコードが得られます。

CUFCUBもちろん、標準のECMA-48名です。CURSORFこれから」と「CURSOR第二不器用". マニュアルを参照してください。

端末制御シーケンスの規則はあなたを驚かせるかもしれません。、DEL、およびを入力しました。端末制御シーケンスの規則は次のとおりです。

  1. エスケープシーケンスを開始します。
  2. DEL は制御文字として直ちに処理されますが、エスケープ・シーケンスはまだ保留中です。
  3. 制御文字としてすぐに処理されますが、エスケープシーケンスはまだ保留中です。
  4. 保留中のエスケープシーケンスをキャンセルします(名前にあります)。
  5. 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

^ITabTAB制御文字で、制御文字(Ctrl+を除く)のあるIキーを押すときも送信されます。

^[、別名、キー\eEsc同じです。

^H\bバックスペース文字とも呼ばれますが、一部の端末ではDEL^?)を送信し、Backspace他の端末では送信しません^H

^Makaは\rReturn / 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つの基本データベースがあり、それぞれtermcapterminfoクエリ用の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 boldstart勇敢なモデル)。
  • infocmp:データベース内のエントリ全体を検索または比較します。

ここでは、後者は、どの端末キーが与えられたシーケンスを送信できるかを調べるのに役立ちます。infocmp -xL1言い換えれば、1行あたりおよびong(より説明的な)関数名と共に格納された端末(したがって端末)のすべての既知の機能の出力識別子です。だから:$TERM1L

$ 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(対応する変数にアクセスしたときに自動的にロードされるモジュール)に現在の端末の機能を公開します。したがって、情報を取得する別の方法は次のとおりです。$terminfozsh/terminfo

$ key=$'\e[1;2D'
$ echo ${(k)terminfo[(Re)$key]}
kLFT

(これは短いterminfo名があります)。

terminfoデータベースは私の端末に送信されたキーをリストしませんが、たとえば、+、+、または+ +を入力すると^[^?そのシーケンスが取得されます。Esc Ctrl?Ctrl[ ?AltCtrl?

おそらくあなたの端末^?がに送信しているかもしれません、または+にそれを受信するDeleteかもしれません。MetaDelete

^X^UCtrlX Ctrl++に送信する予定Uの場合、端末にその機能を送信する機能キーがあるとは想像できませんが、多くの端末エミュレータはすべての文字シーケンスをすべてのキーまたはキーの組み合わせにバインドできます。


1端末は入力時に特定のファンクションキーに対して異なるシーケンスを送信できるため、多くの端末には追加の注意があります。キーボード適用モードそしてそうでないとき。この場合、terminfoエントリは次のことを説明します。キーボード適用モード。アプリケーションは、この関数に対応するシーケンスを送信して端末をこのモードに切り替えることができますsmkx

答え4

強く打つ

$ bind -p | grep -F '[3;5~'
"\e[3;5~": delete-char

関連情報