ANSIエスケープシーケンスは、ビデオテキスト端末や端末エミュレータにおいて、カーソル位置、色、フォントスタイルなどのオプションを制御するためのインバンド信号伝送規格です。ASCIIエスケープ文字と括弧文字で始まる特定のバイト列がテキストに埋め込まれます。端末はこれらのシーケンスを、そのまま表示するテキストではなく、コマンドとして解釈します。ANSIコードを使用すると、テキストの色を変更したり、カーソルを移動したりして、画面上の任意の場所にテキストを描画できます。
ANSIシーケンスは、ベンダー固有のシーケンスに代わるものとして1970年代に導入され、1980年代初頭までにコンピュータ機器市場で広く普及しました。21世紀に入り、ハードウェアテキスト端末はますます少なくなっていますが、端末エミュレータやコマンドコンソールの大部分がANSI規格の少なくとも一部を解釈するため、ANSI規格の重要性は依然として高いままです。
ANSIは「アメリカ国家規格協会」の略です。
ビデオ端末のほぼすべてのメーカーは、画面上の任意の位置にカーソルを配置するなどの操作を実行するために、ベンダー固有のエスケープシーケンスを追加しました。 1 つの例としてVT52ESC端末があり、文字、文字、そして x、y 位置 + 32 に等しい数値を表す 2 つの文字を送信することで、カーソルを画面上の x、y 位置に配置することができましたY(つまり、ASCII スペース文字から開始し、制御文字を回避します)。Hazeltine 1500にも同様の機能があり、 を使用し~、DC1その後、コンマで区切られた X と Y の位置を使用して呼び出されました。 この点に関して、 2 つの端末は同じ機能を持っていましたが、それらを呼び出すには異なる制御シーケンスを使用する必要がありました。
これらのシーケンスは端末ごとに異なっていたため、プログラムが同じAPIを使用してどの端末でも動作できるように、 termcap(「端末機能」)などの高度なライブラリやtputなどのユーティリティを作成する必要がありました。さらに、これらの端末の多くは、行や列などの数値を文字のバイナリ値として送信する必要がありました。一部のプログラミング言語や、内部的にASCIIを使用しないシステムでは、数値を正しい文字に変換することが困難な場合がよくありました。
ANSI 規格は、すべての端末が使用するコマンド セットを作成し、すべての数値情報を ASCII 数値として送信することを要求することで、これらの問題に対処しようとしました。このシリーズの最初の規格は1976 年に採用されたECMA-48でした。 [ 1 ]これは、1965 年のECMA-6という 7 ビット規格からISO 646 が派生した一連の文字符号化規格の継続でした。「ANSI エスケープ シーケンス」という名前は、 ANSI がANSI X3.64 を採用した 1979 年に由来します。ANSI X3L2 委員会は、ECMA委員会 TC 1 と協力して、ほぼ同じ規格を作成しました。これら 2 つの規格は、国際規格 ISO 6429 に統合されました。 [ 1 ] 1994 年に、ANSI は国際規格を優先して、この規格を撤回しました。

これらのシーケンスをサポートする最初の人気ビデオ端末は、1978 年に発売されたDigital VT100でした。 [ 2 ]このモデルは市場で非常に成功し、さまざまな VT100 クローンを生み出しました。その中で最も初期で人気があったのは、1979 年に発売されたはるかに手頃な価格のZenith Z-19でした。 [ 3 ] その他には、Qume QVT-108、Televideo TVI-970、Wyse WY-99GT などがあり、また、さまざまな互換性を持つオプションの「VT100」、「VT103」、「ANSI」モードが他の多くのブランドにありました。これらの人気により、エスケープシーケンスが機能することを前提とするソフトウェア (特に電子掲示板システムやその他のオンラインサービス) が徐々に増え、ほぼすべての新しい端末とエミュレータプログラムがそれらをサポートするようになりました。
1981年、ANSI X3.64はFIPS出版物86により米国政府での使用に採用されました。その後、米国政府は業界標準の重複をやめたため、FIPS出版物86は廃止されました。[ 4 ]
ECMA-48は何度か改訂され、現在は1991年の第5版となっています。[ 5 ]また、ISOおよびIECによってISO/IEC 6429として採用されています。[ 6 ]日本の工業規格JIS X 0211として採用されているバージョンもあります。
関連規格としては、テレテックス規格であるITU T.61、およびオープンドキュメントアーキテクチャ規格であるISO/IEC 8613(主にISO/IEC 8613-6またはITU T.416)がある。これら2つのシステムは、ANSIシステムと多くのエスケープコードを共有しており、コンピュータ端末にとって必ずしも意味のある拡張機能ではないものも含まれている。どちらのシステムもすぐに使われなくなったが、ECMA-48では、これらのシステムで使用される拡張機能が予約済みとしてマークされている。

1980年代初頭、大量のソフトウェアがこれらのシーケンスを直接使用して画面表示を更新していました。これには、 VMS (DEC端末を前提としていた)上のすべてのソフトウェア、 CP/Mホームコンピュータで移植できるように設計されたほとんどのソフトウェア、そしてtermcapライブラリよりも使いやすかったため、かなりの量のUnixソフトウェアが含まれていました。
リモートマシンと通信するためのターミナルエミュレータは、ほぼ例外なくANSIエスケープコードを実装しています。これには、家庭用コンピュータやパーソナルコンピュータ上の電子掲示板システムと通信するために作成されたあらゆるものが含まれます。Unixでは、xtermなどのターミナルエミュレータは同じマシン上で実行されているソフトウェアとも通信できるため、ターミナルエミュレータ上でX11上で実行されているソフトウェアは、これらのシーケンスを書き込む能力を備えている可能性があります。
コンピュータの性能が向上するにつれて、内蔵ディスプレイもそれらをサポートするようになり、ソフトウェアをCP/Mシステム間で移植できるようになりました。プリンターをサポートするためにエスケープシーケンスを拡張する試み[ 7 ]や、初期のPDFのようなドキュメントストレージ形式であるOpen Document Architectureがありました。
1981年に発売されたIBM PCは、これらのエスケープシーケンスはもちろん、画面更新のための他のエスケープシーケンスもサポートしていませんでした。基盤となるBIOSが解釈できたのは、ごく少数の制御文字(BEL、CR、LF、BS )のみでした。表示効果を実現するには、非常に低速なBIOS呼び出しを行うか、IBM PCのハードウェアを直接操作する必要がありました。このため、興味深いソフトウェアは移植性が低く、 PCクローンではディスプレイハードウェアの詳細を再現する必要が生じました。
DOSバージョン2.0には、ANSI.SYSというオプションのデバイスドライバが含まれていました。しかし、性能が低く、デフォルトではインストールされていなかったため、ソフトウェアがこれを利用することはほとんど(あるいは全く)ありませんでした。
WindowsコンソールはANSI エスケープ シーケンスをサポートしておらず、Microsoft もそれを有効にする方法を提供しませんでした。JP Software のTCC (旧 4NT)、Michael J. Mefford の ANSI.COM、Jason Hood のANSICON [ 8 ]、Maximus5 のConEmuなどの代替ソフトウェアは ANSI エスケープ シーケンスを有効にしました。Python の colorama パッケージ[ 9 ]やCygwinなどのソフトウェアは、コンソールに送信されるテキストをプロセス内で変更し、ANSI エスケープ シーケンスを抽出して Windows 呼び出しでエミュレートしました。2016 年、Microsoft はWindows 10バージョン 1511アップデートをリリースし、Windows の登場から 30 年以上経ってから、予期せず ANSI エスケープ シーケンスのサポートを実装しました。[ 10 ]これは、 Windows Subsystem for Linuxと並行して行われ、Unix ライクなターミナル ベースのソフトウェアが Windows コンソールを使用できるようにするために行われたようです。Windows PowerShell 5.1 ではこれがデフォルトで有効になり、PowerShell 6 では必要な ESC 文字を文字列に埋め込むことが可能になりました。[ 11 ] 2019 年に導入されたWindows Terminal は、デフォルトでシーケンスをサポートしています。[ 12 ] Windows 11 22H2 および Windows Terminal 1.15 以降、Windows Terminal は Windows Console に代わってデフォルトになりました。[ 13 ] [ 14 ]`e
ほぼすべてのユーザーが、一部のシングルバイト文字の機能を想定しています。当初ASCIIの一部として定義されたデフォルトのC0制御コードセットは、現在ISO 6429(ECMA-48)で定義されており、ANSIエスケープシーケンスによって呼び出されるC1セットと同じ標準の一部となっています(ただし、ISO 2022では、0x1Bが常にESCである限り、ISO 6429 C0セットをISO 6429 C1セットなしで使用することも、その逆も可能です)。これは、送信されるデータ量を短縮したり、エスケープシーケンスでは利用できない機能を実行したりするために使用されます。
エスケープシーケンスの長さは様々です。ANSI 準拠のエスケープシーケンスの一般的な形式は、ANSI X3.41 (ECMA-35 または ISO/IEC 2022 に相当) で定義されています。[ 15 ] : 13.1エスケープシーケンスは、 0x20〜0x7Fの範囲のバイト(すべての非制御 ASCII 文字) のみで構成され、先読みせずに解析できます。終了前に制御文字、最上位ビットがセットされたバイト、または有効なシーケンスの一部ではないバイトに遭遇した場合の動作は未定義です。
ESCの後に 0x40 から 0x5F の範囲のバイトが続く場合、エスケープシーケンスは 型になりますFe。その解釈は、該当するC1 制御コード規格に委ねられます。[ 15 ] : 13.2.1したがって、ANSI X3.64 / ECMA-48 の C1 制御コードに対応するすべてのエスケープシーケンスはこの形式に従います。[ 16 ] : 5.3.a
規格では、8 ビット環境では、型エスケープ シーケンス ( C1 制御コードFeセットのもの) に対応する制御関数は、0x80 ~ 0x9F の範囲の 1 バイトとして表現できるとされています。[ 16 ] : 5.3.bこれは、ISO 2022 で規定された 8 ビット コードの規定に準拠する文字エンコーディング ( ISO 8859シリーズなど) で可能です。ただし、 UTF-8やCP-1252などの最新のデバイスで使用される文字エンコーディングでは、これらのコードは他の目的で使用されることが多いため、通常は 2 バイト シーケンスのみが使用されます。UTF-8 の場合、C1 コントロールおよび Latin-1 補足ブロックを介して C1 制御コードを表現すると、異なる 2 バイト コード (たとえば、U+008Eの場合は0xC2,0x8E ) になりますが、この方法ではスペースは節約されません。
制御シーケンス導入(CSI)コマンドの場合、ESC [(いくつかのプログラミング言語では\e[、\x1b[またはと表記される\033[)に続いて、0x30~0x3F(ASCII )の範囲の任意の数(0個を含む)の「パラメータバイト」が続き0–9:;<=>?、次に0x20~0x2F(ASCII スペースと)の範囲の任意の数の「中間バイト」が続き!"#$%&'()*+,-./、最後に0x40~0x7E(ASCII )の範囲の単一の「最終バイト」が続く@A–Z[\]^_`a–z{|}~。[ 16 ]: 5.4
一般的なシーケンスはすべて、パラメータをセミコロンで区切られた一連の数値として使用します1;2;3。例: 。 [ 16 ] : 5.4.2欠落した数値はとして扱われます0(1;;3は中央の数値が であるかのように動作し0、 にパラメータがまったくない場合はリセットコードESC[mのように動作します0)。一部のシーケンス(CUUなど)では、欠落したパラメータを有効活用するために をとして0扱います。 [ 16 ] : F.4.21
端末メーカーが標準規格と競合することなく独自のシーケンスを挿入できるように、一部の構成が「プライベート」と宣言されました。パラメータバイト<=>?または最終バイト0x70~0x7E(p–z{|}~)を含むシーケンスはプライベートです。
CSIシーケンスに0x20~0x7Eの範囲外の文字が含まれている場合、端末の動作は未定義です。これらの不正な文字は、C0制御文字(0~0x1Fの範囲)、DEL(0x7F)、または最上位ビットがセットされたバイトです。考えられる応答としては、バイトを無視する、すぐに処理する、さらにCSIシーケンスを続行する、すぐに中止する、または残りの部分を無視する、のいずれかです。
制御シーケンス「Select Graphic Rendition (SGR)」は、表示属性を設定します。複数の属性を同じシーケンスで設定でき、セミコロンで区切られます。[ 25 ]各表示属性は、次のSGRの発生によってリセットされるまで有効です。[ 16 ]コードが指定されていない場合は、 (リセット/通常)として扱われます。CSI n mCSI mCSI 0 m
元の仕様では 8 色しかなく、名前が付けられているだけでした。SGR パラメータ 30〜37 で前景色を選択し、40〜47 で背景色を選択しました。多くの端末では、「太字」(SGR コード 1) を別のフォントではなく明るい色として実装し、8 色の追加前景色を提供しました。通常、これらを背景色として使用することはできませんでしたが、反転ビデオ (SGR コード 7) を使用すると可能になる場合がありました。例: 白い背景に黒い文字を表示するにはESC[30;47m、 を使用します。赤を表示するには、ESC[31mを使用します。明るい赤を表示するには、 を使用しますESC[1;31m。色をデフォルトに戻すには、ESC[39;49m(一部の端末ではサポートされていません) を使用するか、 ですべての属性をリセットしますESC[0m。後の端末では、90〜97 と 100〜107 を使用して「明るい」色を直接指定する機能が追加されました。
以下の図は、従来の規格と最新の端末エミュレータが4ビットカラーコードを24ビットカラーコードに変換する方法の例をいくつか示しています。
グラフィックカードで256色のルックアップテーブルが一般的になると、事前に定義された256色の中から選択するためのエスケープシーケンスが追加されました。[ 36 ]
ESC[38;5; ⟨ n ⟩ m 下表の数値 n から前景色を選択してください ESC[48;5; ⟨ n ⟩ m 背景色を選択 0-7: 標準色 (ESC [30-37 m] と同様) 8-15: 高輝度カラー (ESC [90-97 m] と同様) 16-231: 6 × 6 × 6 立方体 (216 色): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5) 232-255: 暗い色から明るい色まで24段階のグレースケール
これらの値によって表示される色は、認識されている ECMA-48 および ITU の T.416 仕様ではこのルックアップ テーブルに特定のカラー パレットが定義されていないため、端末/エミュレータの実装によって異なります。カラー パレットには上記の式を使用するのが一般的ですが、特に 16-231 キューブ値のアルゴリズムと色の選択は実装によって異なります。XTerm で使用されるカラー パレットとアルゴリズムは、以下に例として示します。[ 16 ] [ 37 ]
ITUのT.416情報技術 - オープン文書アーキテクチャ(ODA)および交換フォーマット:文字コンテンツアーキテクチャ[ 37 ]では、区切り文字として「:」を使用しています。
ESC[38:5: ⟨ n ⟩ m 下表の数値 n から前景色を選択します ESC[48:5: ⟨ n ⟩ m 背景色を選択
上記の表にある色のRGB値を計算するには、以下のPythonスクリプトを使用できます。
# xtermで使用される256色の赤/緑/青の値のリストを表示します。## 参照:# https://github.com/ThomasDickey/ncurses-snapshots/blob/master/test/xterm-16color.dat# https://github.com/ThomasDickey/xterm-snapshots/blob/master/XTerm-col.ad# https://github.com/ThomasDickey/xterm-snapshots/blob/master/256colres.plprint ( "色0~15はANSIおよびaixtermの命名規則に対応しています" )範囲( 0 , 16 )内のコードについて:コードが8より大きい場合:レベル= 255elif code == 7 :レベル= 229それ以外:レベル= 205r = 127 (code == 8の場合)、それ以外の場合はレベル( code & 1 ) != 0の場合) 、それ以外の場合は92 (code == 12の場合)、それ以外の場合は0g = 127 (code == 8の場合)、それ以外の場合はレベル( code & 2 ) != 0の場合) 、それ以外の場合は 92 (code == 12の場合)、それ以外の場合は0b = 127 (code == 8 の場合)、そうでなければ238 (code == 4の場合)、そうでなければlevel ( code & 4 ) != 0の場合) 、そうでなければ0print ( f " { code : 3d } : { r : 02X } { g : 02X } { b : 02X } " )print ( "色16~231は6x6x6のカラーキューブです" )赤色の範囲( 0 , 6 )について:緑色の範囲( 0 , 6 )について:青色の範囲( 0 , 6 )について:コード= 16 + (赤* 36 ) + (緑* 6 ) +青r = red * 40 + 55 ( red != 0の場合)、そうでなければ0g = green * 40 + 55 ( green != 0の場合)、それ以外の場合は0b = blue * 40 + 55 ( blue != 0の場合)、そうでなければ0print ( f " { code : 3d } : { r : 02X } { g : 02X } { b : 02X } " )print ( "232~255の色はグレースケールのグラデーションで、意図的に黒と白は除外されています" )範囲( 0 , 24 )内のgrayについて:レベル=グレー* 10 + 8コード= 232 +グレーprint ( f " { code : 3d } : { level : 02X } { level : 02X } { level : 02X } " )また、同じエスケープシーケンスを使用した類似だが互換性のない88色エンコーディングも存在し、およびで見ることができるrxvt。xterm-88color[ 38 ]これ は4×4×4の色キューブを使用する。
16~24ビットの色を持つ「トゥルーカラー」グラフィックカードが普及するにつれて、アプリケーションは24ビットカラーをサポートするようになりました。エスケープシーケンスを使用して24ビットの前景色と背景色を設定することをサポートするターミナルエミュレータには、Xterm [ 17 ]、KDEのKonsole [ 39 ] [ 40 ]、iTerm、およびGNOME Terminal [ 42 ]を含むすべてのlibvteベースのターミナル[ 41 ]などがあります。
ESC[38;2; ⟨ r ⟩ ; ⟨ g ⟩ ; ⟨ b ⟩ m RGB の描画色を選択 ESC[48;2; ⟨ r ⟩ ; ⟨ g ⟩ ; ⟨ b ⟩ m RGB背景色を選択
この構文は、当初 XTerm で実装されたもので、 ISO/IEC 8613-6 仕様の解釈に基づいています。具体的には、SGR 38 / SGR 48 にパラメータ "2" を続けて指定することで、RGB 空間の「直接色」を指定できます。[ 43 ]。広く使用されている最初の実装として、セミコロン区切り文字を使用したこの RGB 値の指定は、24 ビットカラーをサポートする端末エミュレータで広くサポートされています。
8 ビットカラーコードと同様に、 ITUの T.416 Open Document Architecture (ODA) および交換フォーマット: Character content architectures [ 37 ]には、24 ビットカラーの非常によく似た仕様があり、これは ISO/IEC 8613-6 として採用されましたが、商業的には失敗に終わりました。ODAバージョンはより複雑であるため、上記のセミコロンで区切られたバージョンとは互換性がありません。
ESC[38:2: ⟨カラースペースID ⟩ : ⟨ r ⟩ : ⟨ g ⟩ : ⟨ b ⟩ : ⟨未使用⟩ : ⟨ CS許容値⟩ : ⟨カラースペース⟩ m RGB前景色を選択 ESC[48:2: ⟨カラースペースID ⟩ : ⟨ r ⟩ : ⟨ g ⟩ : ⟨ b ⟩ : ⟨未使用⟩ : ⟨ CS許容値⟩ : ⟨カラースペース⟩ m RGB背景色を選択
ここで、 はColor-Space指定された許容値に関連付けられた色空間を示します。CIELUV0の場合は1CIELAB です。
セミコロンベースのRGB仕様が最も広くサポートされていますが、多くの端末エミュレータでは、セミコロンベースのRGB仕様とITU T.416のRGBバリアントの両方がサポートされています。[ 44 ] [ 45 ]
SVr3.2 (1987) で導入された termcap および terminfo のカラーサポートを使用する代わりに、[ 46 ] S-Lang ライブラリ (バージョン 0.99-32、1996 年 6 月) は、$COLORTERM端末エミュレータがカラーを使用できるかどうかを示すために別の環境変数を使用し、後に 24 ビットカラーをサポートしているかどうかを示す値を追加しました。[ 47 ] [ 48 ]このシステムは、ドキュメントが不十分でしたが、Fedora および RHEL が、更新されたライブラリに問い合わせるよりもシンプルで汎用的な検出メカニズムとして使用することを検討するほど広く普及しました。[ 49 ]
一部のターミナルエミュレータ(urxvt、Konsole)は、$COLORFGBGターミナルのカラースキーム(主に明るい背景と暗い背景)を報告するように設定されています。この動作はS-Lang [ 48 ]に由来し、vimで使用されています。Gnome-terminalは、値の構文が合意されていないこと、パレットの実行時変更で値を変更できないこと、より「適切な」xterm OSC 4/10/11シーケンスが既に存在することから、この動作を追加することを拒否しています。[ 50 ]
環境変数を使用して色を無条件に無効にするのが一般的になっているNO_COLOR。[ 51 ]
ほとんどのオペレーティングシステムコマンドシーケンスはXtermによって定義されていますが、他のターミナルエミュレータでもサポートされているものも多くあります。歴史的な理由から、XtermはBEL標準のST(0x9Cまたは0x1B 0x5C)だけでなく、(0x07)でコマンドを終了することもできます。[ 17 ]例えば、Xtermではアイコン名とウィンドウタイトルをで設定できますESC ]0;this is the title BEL。
xterm以外の拡張機能としては、ESC ]8;;link ST2017年からVTE [ 52 ] 、 iTerm2 [ 52 ]、mintty [ 53 ]などで使用されているハイパーリンクがある[ 54 ]。
Linux コンソールはESC ] P n rr gg bbパレットを変更するために使用しますが、アプリケーションにハードコードすると、他の端末がハングアップする可能性があります。[ 55 ]ただし、追加するとSTLinux によって無視され、他の端末に対しては適切な無視可能なシーケンスが形成されます。
の後に0x60〜0x7EESCの範囲のバイトが続く場合、エスケープシーケンスは 型になります。この型は、ISO-IRレジストリに個別に登録された制御機能に使用されます。[ 56 ]これらの表はISO/IEC 2022に記載されています。Fs
の後に0x30〜0x3F のESC範囲のバイトが続く場合、エスケープシーケンスは 型となり、これは最大 16 個のプライベート使用制御機能用に確保されています。[ 15 ] : 6.5.3Fp
の後に0x20〜0x2F のESC範囲のバイトが続く場合、エスケープシーケンスは 型になります。このバイトの後には、この範囲の任意の数のバイトが続き、その後0x30〜0x7Eの範囲のバイトが続きます。これらのエスケープシーケンスは、最初のバイトの下位 2 ビットによってさらに細分類されます。たとえば、最初のバイトが0x22 のシーケンスの場合は「type 」となります。また、最後のバイトが0x30〜0x3F の範囲にあるかどうかによっても細分類されます。範囲にある場合はプライベート使用(例:「type 」)を示しますが、そうでない場合は「type 」となります。[ 15 ]: 13.2.1nF2F2Fp2Ft
ほとんどのnFtシーケンスは現在の文字セットを変更するためのもので、ISO/IEC 2022に記載されています。その他のシーケンスは以下のとおりです。
最初のバイトが「#」の場合、パブリックシーケンスは追加のISO-IR登録済み個別制御機能用に予約されています。[ 15 ]: 6.5.2現在、そのようなシーケンスは登録されていません。[ 56 ]タイプ3Fpシーケンス(「#」で始まるものを含む)は、プライベート使用の制御機能に使用できます。[ 15 ]: 6.5.3
CSI 2 J— これにより画面がクリアされ、一部のデバイスではカーソルがy、x座標1、1(左上隅)に移動します。
CSI 32 m— これによりテキストが緑色になります。緑色は暗くくすんだ緑色になる可能性があるため、CSI 1 m明るい緑色にするには、シーケンスを使用して太字を有効にするか、または と組み合わせることをお勧めします。一部の実装では、太字の状態を使用して文字を明るくします。CSI 32 ; 1 m
CSI 0 ; 6 8 ; "DIR" ; 13 p— これは、F10 キーに文字列 "DIR" と ENTER を送信するように再割り当てします。これにより、DOS コマンドラインでは現在のディレクトリの内容が表示されます。(MS-DOS ANSI.SYS のみ) これは、ANSI 爆弾に使用されることがありました。これは、文字列値のパラメータを含めるために非標準の拡張機能を使用する、私的使用コードです (文字 p で示されています)。標準の文字に従うと、シーケンスは文字 D で終了すると考えられます。
CSI s— これはカーソル位置を保存します。このシーケンスを使用すると、CSI uカーソル位置が復元されます。現在のカーソル位置が 7(y) と 10(x) だとします。このシーケンスは、CSI sその 2 つの数値を保存します。これで、シーケンスまたはを使用して、20(y) と 3(x) など、別のカーソル位置に移動できます。ここで、シーケンス CSI u を使用すると、カーソル位置は 7(y) と 10(x) に戻ります。一部の端末では、より広くサポートされている DEC シーケンス/ が必要です。CSI 20 ; 3 HCSI 20 ; 3 fESC 7ESC 8
ANSIエスケープコードは、UNIXおよびUNIXライクな端末で構文強調表示を行うためによく使用されます。例えば、互換性のある端末では、次のリストコマンドはファイル名とディレクトリ名を種類別に色分け表示します。
ls --color
ユーザーは、標準出力または標準エラーの一部としてエスケープコードを含めることで、スクリプト内でエスケープコードを使用できます。たとえば、次の GNU sedコマンドは、 makeコマンドの出力を装飾し、「WARN」で始まる単語を含む行を逆再生で表示し、「ERR」で始まる単語を濃い赤色の背景に明るい黄色で表示します (大文字と小文字は区別されません)。コードの表現は強調表示されます。[ 61 ]
make 2 > & 1 | sed -e 's/.*\bWARN.*/ \x1b[7m & \x1b[0m /i' -e 's/.*\bERR.*/ \x1b[93;41m & \x1b[0m /i'次のBash関数は、ユーザーがキーを押すまで、端末を点滅させます (逆方向と通常のビデオ モードのコードを交互に送信することによって)。[ 62 ] これは、たとえば のように、長いコマンドが終了したときにプログラマに警告するために使用できます。[ 63 ]make ; flasher
flasher(){whiletrue;doprintf'\e[?5h' '\e[?5l';sleep0.1;printf;read-s-n1-t1&&break;done;}
以下のコマンドは、最新のLinuxシステムにおけるコマンドと同様にコンソールをリセットしますreset。ただし、古いLinuxシステムやその他の(Linux以外の)UNIX系システムでも動作するはずです。
printf '\033c'以下のプログラムは、0から109までの数値の表を作成し、それぞれの数値を、指定されたグラフィックレンダリングコードを使用して、 Select Graphic Renditionエスケープシーケンスで指定された形式で表示します。

#include <stdio.h>int main ( void ){int row 、col 、n ;for ( row = 0 ; row < 11 ; row ++ ) {for ( col = 0 ; col < 10 ; col ++ ) {n = 10 * row + col ;if ( n > 109 ) break ;printf ( " \033 [%dm %3d \033 [m" , n , n );}printf ( " \n " );}0を返す;}キーボードの特殊キーを押したり、xtermのCSI、DCS、またはOSCシーケンスを多数出力したりすると、ユーザーが入力したかのように、端末からコンピュータにCSI、DCS、またはOSCシーケンスが送信されることがよくあります。
端末で入力を行う際、通常のメイン英数字キーボード領域外のキー操作は、ANSIシーケンスとしてホストに送信されます。カーソルキーなど、同等の出力機能を持つキーの場合、これらのシーケンスは多くの場合、出力シーケンスを反映しています。しかし、ほとんどのキー操作には、使用できる同等の出力シーケンスは存在しません。
エンコード方式は複数存在し、残念ながらほとんどの端末は異なる方式のシーケンスを混在させているため、ホストソフトウェアはあらゆる方式の入力シーケンスに対応できなければなりません。さらに複雑なことに、VT端末自体にも、アプリケーションによって切り替え可能な通常モードとアプリケーションモードという2つの入力方式があります。
(草稿部分)
<char> -> char <esc> -> esc <esc> <esc> -> Alt-esc <esc> <char> -> Altキーの押下またはキーコードシーケンス <esc> '[' -> Alt-[ <esc> '[' (<modifier>) <char> -> キーコードシーケンス、<modifier> は10進数です 数値で、デフォルト値は1(xterm)です。 <esc> '[' (<キーコード>) (';'<修飾キー>) '~' -> キーコードシーケンス、<キーコード> と <修飾キー> 小数であり、デフォルト値は 1 (vt) です。 末尾の文字が「~」の場合、最初の数字は必須でキーコード番号となり、2番目の数字はオプションの修飾子値となります。末尾の文字が文字の場合、その文字がキーコード値となり、オプションの数字が修飾子値となります。
修飾子の値はデフォルトで 1 になり、1 を減算すると、押されている修飾キーのビットマップになります: Meta+ Ctrl+ Alt+⇧ Shift。たとえば、<esc>[4;2~は +、はファンクションキー、は+です。⇧ ShiftEnd<esc>[20~F9<esc>[5CCtrl→
つまり、修飾子は以下の数値の合計です。
vt配列: <esc>[1~ - ホーム <esc>[16~ - <esc>[31~ - F17] <esc>[2~ - 挿入 <esc>[17~ - F6 <esc>[32~ - F18 <esc>[3~ - 削除 <esc>[18~ - F7 <esc>[33~ - F19] <esc>[4~ - 終了 <esc>[19~ - F8 <esc>[34~ - F20] <esc>[5~ - PgUp <esc>[20~ - F9 <esc>[35~ - <esc>[6~ - PgDn <esc>[21~ - F10 <esc>[7~ - ホーム <esc>[22~ - <esc>[8~ - 終了 <esc>[23~ - F11 <esc>[9~ - <esc>[24~ - F12 <esc>[10~ - F0 <esc>[25~ - F13] <esc>[11~ - F1 <esc>[26~ - F14] <esc>[12~ - F2 <esc>[27~ - <esc>[13~ - F3 <esc>[28~ - F15] <esc>[14~ - F4 <esc>[29~ - F16 <esc>[15~ - F5 <esc>[30~ - xterm配列: <esc>[A - 上 <esc>[K - <esc>[U - <esc>[B - 下 <esc>[L - <esc>[V - <esc>[C - 右 <esc>[M - <esc>[W - <esc>[D - 左 <esc>[N - <esc>[X - <esc>[E - <esc>[O - <esc>[Y - <esc>[F - 終了 <esc>OP - F1 <esc>[Z - <esc>[G - キーパッド 5 <esc>OQ - F2 <esc>[H - ホーム <esc>または - F3 <esc>[I - <esc>OS - F4 <esc>[J - <esc>[T -
<esc>[Aから は、<esc>[DANSI 出力シーケンスと同じです。<modifier>修飾キーが押されていない場合、 は通常省略されますが、ほとんどの実装では常に–<modifier>に対してが出力されます。(草案セクション)F1F4
Xtermには、DECのVT端末やエミュレートしている他のさまざまな端末のさまざまなファンクションキーとマウス入力シーケンス方式に関する包括的なドキュメントページがあります。[ 17 ] Thomas Dickeyは長年にわたって多くのサポートを追加してきました。 [ 64 ]また、比較のために他の端末エミュレータで使用されているデフォルトキーのリストも維持しています。[ 65 ]
CSI [ char[SS3 1; modifierscharF1F4CSI row ; column RCSI 1 ; modifiers RF3row == 1CSI ? 6 nCSI ? row ; column RESCAltキーを押しながら入力された文字の前に付加文字が付加されます。これにより、大文字や記号に曖昧さが生じ@[\]^_、C1コードが生成されることになります。SS3 modifierscharF1F4これには、Windows ターミナル、ConPTY、および仮想ターミナル シーケンスを優先して、従来のコンソール ホスト ユーザー インターフェイスを既定の位置から廃止することが含まれます。