「shift-tab」が端末で「Escape」を発生させるのはなぜですか?

「shift-tab」が端末で「Escape」を発生させるのはなぜですか?

私はこれを偶然見つけました。

私はreadlineモード(でvi実行)を使用しており、特に目立つ。 readlineモードでは何もしないようですが、readlineモードでは挿入モードを終了します(通常モードに入ります)。set -o vibashemacsEscvi

私は文書化された内容Shiftを見ることができず、キーの説明よりも基本的なようです。たぶん読書ラインにありますか?Tabman bashEscbash

Mac OS XとLinuxで動作します。

この文書はどこにありますか?

答え1

Shift+Tab複数の端末からこのようなエスケープシーケンスを送信します。

ESC [ Z

Linuxコンソール端末で使用されます。1995年から、xtermの一部2002年から、その時点から1つまたは別の端末をエミュレートするために使用されます。

説明では、terminfoこれは次のように表示されます。

kcbt=\E[Z,

そしてkcbt記録されたterminfo(5):

key_btab                  kcbt   kB   back-tab key

分析的な観点から、これはファンクションキーを押すことと変わりません。 readlineにはキー編集のためのいくつかの特別な場合があります(bashのtermcap文字列テーブルに依存)。lib/readline/terminal.c)、しかしtermcap"kB"はその中にありません。

追加された複雑さで、構成の変更は次のように始まります。2007年これにより、LinuxコンソールのShift-Tabを押すと、次のメッセージが送信されます。その他エスケープシーケンス、つまり

ESC TAB

これは2021年に報告され、ターミナルデータベースが修正されました。これを行うと、Emacs開発者に少しの苦痛があります(参照:メーリングリストスレッド)、そのプログラムは「kB」を確認します。しかし、2022年5月現在の問題は解決されたようです。

いずれにしても bash は termcap 文字列を無視します。

bashにtermcap情報がない場合は依存します.inputrc。どちらにも一致するものがない場合ESC(エスケープされた)文字は、説明したように挿入モードを終了します(最終的にviです)。


これに使用されるエスケープシーケンスは次のとおりです。ECMA-48標準のポストタブ制御シーケンス。この内容はにも記録されています。terminfo(5):

   back_tab                    cbt       bt     back tab (P)

特殊キーに制御シーケンスとして同じエスケープシーケンスを使用することは完全に偶然ではありません。ハードウェア端末は、特別なキーをエコーするためにホストに依存せず、カーソル移動キーが画面の周りにカーソルを移動するローカル編集モードを提供することが多い。 ncurses端末データベースの端末記述の約半分は、特殊キーと制御シーケンスの間の関連性を示しています。

 439 entries with cbt == kcbt
  73 entries with clear == kclr
 383 entries with cub1 == kcub1
 505 entries with cud1 == kcud1
 885 entries with cuf1 == kcuf1
 868 entries with cuu1 == kcuu1
 174 entries with dch1 == kdch1
 186 entries with dl1 == kdl1
 502 entries with home == khome
  52 entries with ich1 == kich1
 139 entries with il1 == kil1

cub1端末記述は通常、2〜3文字の制御シーケンスの代わりに1文字のバックスペースまたは改行文字を使用するため、andの数はsumcud1未満です。それにもかかわらず、439の[投稿]タブは、端末の説明の約4分の1がこの特定の機能を使用していることを示しています。cuf1cuu1

Linuxコンソールは、まずShift-Tabを使用してバックタブエスケープシーケンスを送信しません。次の古いアイテムがあります。アンアーバーこの機能を使用するAT&T項目も同様です。後者はビットプロテクターのマニュアルはほとんどありませんが、AT&T 610そしてAT&T 630マニュアル提供。

答え2

Escキーで解釈するのはbashよりも基本的なようです。たぶん読書ラインにありますか?

それよりはるかに低いです。これは、Unices および Unix シリーズのオペレーティングシステムで動作する端末の必須属性です。オペレーティングシステムは、端末I / Oを8ビット(または7ビット)文字シーケンスとして扱います。ファンクションキーと拡張キーは、マルチ文字エスケープシーケンスで送信されます。

実際の端末では、これらのエスケープシーケンスは端末自体のファームウェアによって生成されます。ターミナルエミュレータプログラムでは、ターミナルエミュレータはキー入力データ(X Windowシステム、USB隠しデバイス、Linuxイベントデバイスなどのキーボードと通信するユーザーインターフェイスを介して受信したデータ)をエスケープシーケンスに変換します。

vimさまざまな行編集ライブラリなどのアプリケーションは、Escエスケープ文字を読み取るのと次の文字を読み取るまでの時間を(実際に)タイミングして、単純なキー押しと区別しようとします。文字が順番に到着すると、エスケープシーケンスとして扱われます。

この文書はどこにありますか?

入力におけるエスケープシーケンスのタイムアウト処理は、以下のZ ShellのZLEマニュアルページvimとZLEマニュアルページに文書化されています。エスケープシーケンスの端末生成に関する基本的なアイデアは広く文書化されている。 :help ttimeoutzshzle

生成された特定のエスケープシーケンスのドキュメントを取得することは困難です。多くの(現在おそらくほとんどの)端末(特にアナログ端末)は、DEC VT端末が長年使用してきたエスケープシーケンスを使用します(Digitalで「ANSIモード」と呼んでいる場合)。 DECは端末に関するドキュメントを提供し、ShiftVT525プログラマ情報docoの第8章で+エンコーディングについて明示的に議論するものを見つけることができます。Tab

ただし、ターミナルエミュレータプログラムがオペレーティングシステムカーネルの一部であるLinuxまたはBSDでカーネル仮想ターミナルを使用している場合、次の場合にはDEC VTルールの準拠が非常に不安定です。入力する制御順序。その理由の1つは、FreeBSDなどのオペレーティングシステムが実際にはデフォルトでSCO XENIX仮想端末ルールに準拠しているためです。その結果、実際の端末と一致しないDEC VTとSCO XENIXの奇妙な混合が生まれました。

このミックスは、単純な入力端子エミュレーションと出力端子エミュレーションの間の不一致以上です。このような状況は、最新の構成が入力制御シーケンスに対してSCO XENIXのデフォルト値を無視しようとしますが、部分的にのみ実行されるという事実により、さらに悪化します。たとえば、最近のFreeBSDでは、カーネル端末エミュレータでF6DEC VT制御シーケンスがCSI 1 7 ~SCO XENIXシーケンスにコンパイルされていますが、Shift+はまだDEC VT制御シーケンスではなくF6SCO XENIX制御シーケンスにコンパイルされていることがわかります。CSI dCSI 1 7 ; 2 ~

そしてこれらはFreeBSD docoにはまったくありません。

追加読書

関連情報