なぜ `ctrl+[` と `ESC` の両方が `^[` を生成するのですか? [コピー]

なぜ `ctrl+[` と `ESC` の両方が `^[` を生成するのですか? [コピー]

ctrlBashでは、+を押してvそのまま挿入を開始します。アキュムレータモードでEscキーを押すとbashが表示されます^[。私はそれをファイルにリダイレクトしますesc

また、逐語モードでctrlキーを押すと[bashが表示されます^[。私はそれをファイルにリダイレクトしますctrl

次に、2つのファイルを比較した結果、同じものが見つかりました!

$ echo '^[' > esc
$ echo '^[' > ctrl
$ diff esc ctrl
$

Ctrl+[Esc同じコンテンツを生成するのはなぜですか?

^[ここC0およびC1制御コード?それでは、Wikiの記事には^[Escapeと言われていますがctrl+[もEscapeなのはなぜですか?

基本的な問題は、キーバインディングを確認して生成したいということです。

(zsh)$ bindkey -L 
...
bindkey "^['" quote-line
...

だから私は入力する必要ESC+'がありますかctrl+[+'

答え1

^Aこれは文字コード1で、^@NULバイトを表すために使用されるCtrl-Aと同じロジックに従うようです。ここでは^、Ctrlを別のキーで表現する一般的な方法です。

つまり、与えられた入力文字コードは次のようになります。Ctrl-foo金持ちビット6がクリアされ、文字コードが64減少します。したがって、A文字コード^A1は文字コード65、0の64、27の@ESCです。 ESC には別個のキーがありますが、制御文字も生成する Enter キーと Tab キーもあるので、それほど珍しいものではありません。^@[^[

もちろん、現代のシステムの仕組みは、キーマップやキーバインディングの設定方法などの他の要因によっても変わります。また、たとえば、文字コードが64未満の場合はどのように機能するのか尋ねないでください。端末で試しましたが、NULバイトが出ました。Ctrl-something^1Ctrl-space

答え2

bashなどのテキスト端末アプリケーションでテキスト端末を使用している場合は、特殊キー(たとえば、および)EscTab対応EnterするBackspace制御文字([IM / JH /?)を区別できません。同様に、数字列の数字と数字パッドの数字も区別できません。他のいくつかのキー(矢印、ファンクションキー、ページの上/下など)は複数の文字シーケンスを生成します。

ただし、グラフィカル環境(X11、ウェイランド)では、キーを押すとキーの押下に関連するイベントが生成されます。これは、単一の文字マップであるか複数の文字マップであるかに関係なく、文字マップとは無関係ですが、リンクされています。グラフィックアプリケーションは、選択した場合、これらのキーのほとんどを区別できます。 (場合によっては、キーにまだ区別できないマッピングがある可能性がありますが、これはまれであり、キーのマッピング方法によって異なります。)

デフォルトでは、グラフィックターミナルアプリケーションは、これらのキーとキーシーケンスを区別しないことを選択し、テキストptyを介してデフォルトのテキストアプリケーションに違いを渡す方法はありません。

たとえば、キーは伝統的にまたはBackspaceにマッピングできます。グラフィック端末には、マッピングする項目を選択する設定があります。したがって、グラフィック端末アプリケーションは違いを検出してマッピングを変更できますが、端末で実行されているテキストアプリケーションはそうではありません。Ctrl-HCtrl-?

答え3

簡単に言うと:歴史

「理由」は、ASCIIが標準化される前の10年間にわたって下された設計決定にさかのぼります。ISO 6461967.

当時、ほとんどの端末はハードコピー印刷形式であり、キーボードには全くキーがないことが多かったですESC。誰かがASCIIコード27を送信するには、ESCCtrl-[;を入力します。そうするにはほとんど意味がないが。

これらの新しい「ガラステレタイプ」端末が1970年代に人気を博したとき、コード27をより広く使用していたため、ほとんど(すべてではありませんが)ESCキーがありました。

これまでのところ、唯一の用途はESCASCIIコード27を生成することであることを強調することが重要です。端末はこれを「次のバイトが表示内容ではなくコマンドで処理されるモードに変更する」と理解しています。

もう10年後にはさまざまなウィンドウシステムが登場し、ESCキーはまったく新しい目的を持つようになりました。現在のジョブをキャンセル

しかし、これは適用されませんこれは、端末を使用する場合のウィンドウモード環境でも同様です。代わりに、1967 ASCIIで指定されたのと同じ動作を続けます。

Ctrlキーがこれを行う理由は、@user10489の別の答えで説明されています。

関連情報