ASCII Ctrl-CやCtrl-Zなどの制御文字へのエスケープシーケンスの共通の組み合わせがそれぞれETXおよびSUBにあります。
ウィキペディア コントロールコード ページには、ほとんどのペアリングがありますが、引用されているリファレンスはありません。
制御文字とキーシーケンスの組み合わせは標準の一部ですか?
Linuxと他のOSの場合、どこにリストされていますか?
これらの組み合わせをリストしたマニュアルページはありますか?
彼らは純粋に数十年の不文律であるのでしょうか?
参照
stty -a
システムのリストsome私は1984年にANSIコードX3.64-1979、ANSI X3.4-1977、およびANSI X3.41-1974を要約したドキュメントを書きました。この ansicode.txt は、制御コードがDEC LAシリーズのハードコピー端末とVTシリーズのビデオ端末にどのように影響するかを示しています。
組み合わせは「ラテンアルファベット」、1から26です(ASCIIの残りの部分も))。
Ctrl-C ETX、バイト値3(0x03
、000000011
); C
はASCII 67(0x43
、010000011
)。ビット7をフリップ(64を加算/減算)して、一方から他方に切り替えます。 SUBはバイト値26などで、1から26およびAからZの順に 前述のWikipediaページ にリストされています。
その他のC0コントロールは、 Ctrl その他の非アルファベット文字:NULは Ctrl-@、@
はASCII 64、および[
(91)はESC(27)に対応し、スペースを押すまで続きます。
[〜#〜] ascii [〜#〜] は、Unicodeや他の多数のエンコード標準と同様に、これらのバイトをこれらのラベルと(ある程度)意味で定義します。の用法 Ctrl そのビットを反転するかどうかは端末または入力ドライバによって決定されますが、「制御文字」という名前は、そのペアリングがどのように行われるかをかなり示唆しています。これらは、この伝統に従って、どのシステムでも文字とバイトの対応は同じになります。
一方、ASCIIコントロールとそのキーシーケンスの多くは、少なくとも最近のUnixライクなシステムでは、使用されていないか、当初想定されていた目的とは異なる目的で使用されています。 Ctrl-C そして Ctrl-D 効果は依然としてかなり平行していますが、 Ctrl-V たとえば、最近は同期アイドルではなくリテラル入力を開始するために通常使用され、グループセパレーターを実際に目にしたことはありません。
それがPOSIXの一部であることを除外できます。 POSIXは、このマッピングがあるASCIIセット、またはASCIIエンコーディング(数値) のいずれかを必要としないように試みますたとえば、言及するETX文字はPOSIXでは必須ではありません。POSIXは INTRおよびSUSP に使用される文字を説明するとき、デフォルトとしてControl-C/ETXまたはControl-Z/SUBについて言及していません。 =、例えば。
他の人が指摘したように、Ctrlキーの動作は、文字セット/文字エンコーディングの定義の一部ではありません。 ControlキーマッピングがASCIIの一部として指定されていなかったようです。それは一連のANSI端末規格の一部でもないようです。
私はこの動作がそれよりも古いと期待していますが、事実上の標準となったVT100/VT102に関して、この動作の期待を部分的に説明できると思います。 「 端末が使用するプロトコル/標準は? 」を参照してください
VT102ユーザーガイドの "送信文字" -> "ファンクションキー"-> "制御文字キー"を参照してください。
図4- は、制御文字を生成するキーを示しています。制御文字は2つの方法で生成できます。
- CTRLを押しながら、図4-3の影のないキーを押します。
- CTRLを使用せずに、図4-3の色付きのキーを押します。これらの専用キーは、CTRLを使用せずに制御文字を生成します。
表4-2 は、キーボードによって生成される制御文字をリストします。異なるコンピュータシステムでは、各制御文字を異なる方法で使用できます。
注:VT102は、以前のDIGITAL端末とは異なるいくつかの制御文字を生成します。 表4- は変更をリストします。
この最後のメモは特に興味深いものでした。 VT102はNULにControl-spaceを使用していますが、Digitalの「以前の端末」はControl- @を使用していました。また、最後の2つのC0コントロール、RSとUSのエスケープも変更します。 (これがビット7の反転のパターンにどのように適合するのかと思います)。 VT100もControl-spaceを使用します なので、「以前の端末」は VT52 ファミリを指していると思います。
これは、異なるハードウェアドライバー(たとえば、 PS/2キーボードv.s. USBキーボード。代わりに VTレイヤー で処理されます。見る vt/keyboard.c
。コントロールを含むキーボード修飾子の状態は、shift_state
。次に、シフト状態を使用してキーマップを選択します。
param.shift = shift_final = (shift_state | kbd->slockstate) ^ kbd->lockstate;
param.ledstate = kbd->ledflagstate;
key_map = key_maps[shift_final];
https://elixir.bootlin.com/linux/v4.16.8/source/drivers/tty/vt/keyboard.c#L139
したがって、詳細については、VTレイヤーで使用されている keymaps を調べる必要があると思います。 Controlのキーマップは、あなたが説明するペアリングを生成するように設定されていると思います。
loadkeys のマニュアルページでも、カーネルのデフォルトのキーマップについて説明しています。これはmanページが書かれてから移動されました。現在は drivers/tty/vt/defkeymap.c_shipped にあります。これらのテーブルを読み取るには、インデックスの作成に使用されるLinuxキーコードを知っている必要があります。これらはQWERTYキーボードに基づいているため、文字はアルファベット順でも連続でもありません。 include/uapi/linux/input-event-codes.h を参照してください。以上、 this table キーコードとデフォルトのコントロールマッピングの両方を表示します。