制御シーケンス

制御シーケンスは、プログラムがターミナルとやり取りするための手段です。

制御シーケンスは、カーソルの移動、テキストの色の変更、画面の消去などに使われます。これらは プログラムがターミナルとやり取りする主な手段です。

ターミナル内で動作するプログラムがターミナルと通信できる方法は 1 つだけです: 接続されたファイルディスクリプター(通常は擬似ターミナル、略して「pty」)への バイトの書き込みです。表示すべきテキストと実行すべきコマンドを 区別するため、ターミナルは制御シーケンスと総称される 特殊な構文を使います。

制御シーケンスの種類ごとに、異なる形式と目的があります。 それぞれの具体的な構文とともに以下で説明します。 リファレンス には、種類ごとにまとめられたサポートされる 制御シーケンスの完全な一覧があります。

C0 制御文字

すべての制御シーケンスは、制御文字と呼ばれる、印字できない特殊な文字で始まります。最も単純な制御文字である C0 制御文字は、ASCII エンコーディングの 0x00〜0x20 の 範囲にあり、自身以外のパラメーターを取りません。

制御文字の数はごく少ないですが、その 1 バイトの値がターミナルの状態に 影響するため、重要です。

ターミナルエミュレーションにとって意味のある C0 文字は次のとおりです:

C0略称全名機能
0x07BELベルユーザーの注意を促します。
0x08BSバックスペースカーソルを 1 つ後ろへ移動します。
0x09TABタブカーソルを次のタブストップへ右へ移動します。
0x0ALF改行カーソルを 1 行下へ移動します。
0x0DCR復帰カーソルを最左列へ移動します。

エスケープシーケンス

C0 文字のひとつ、エスケープ(0x1b、ESC)は特殊です。いくつかの個別のシーケンスを 開始することもできれば、シーケンスの一族全体を始めることもできます。これが 制御シーケンスが pars pro toto(部分による全体)として通称 エスケープシーケンスとも呼ばれる理由です。

エスケープで始まるすべてのシーケンスがここで定義するエスケープシーケンスであるとは限らず (多くは C1 シーケンス です)、 ESC D のような真のエスケープシーケンスは以下の形式をとります。

esc_sequence = "0x1B" intermediates final
intermediates = [0x20-0x2F]*
final = [0x30-0x7E]

Fe シーケンス

エスケープの後に特定の印字可能文字が続くと、いくつかのややこしい歴史的経緯から C1 制御文字としてまとめて解釈されます。その一部は、Fe シーケンスと 総称される多くのシーケンスの族の担い手です。これらの文字は 1 バイトの 8 ビット文字で 表現することもできますが、モダンなターミナルで普通に使われる UTF-8 などの 上位バイトのエンコーディングと衝突しないように、主にエスケープ文字でエンコードされたままです。

ESC コードC1略称全名機能
ESC [0x9bCSI制御シーケンス導入子圧倒的に最も一般的です。整数を使ってカーソル、画面、モード、セル、そのスタイルを制御します。
ESC ]0x9dOSCオペレーティングシステムコマンドモダンなターミナル拡張で文字列データを伝送するのによく使われます。
ESC P0x90DCSデバイス制御シーケンスターミナルのケイパビリティを照会するとき(XTGETTCAP)に最もよく使われます。それ以外ではまれです。
ESC _0x9fAPCアプリケーションプログラムコマンド任意のペイロードを必要とする Kitty Graphics Protocol などの非常に複雑なプロトコルで使われます。
ESC X0x98SOS文字列開始廃止済みです。Ghostty は無視します。
ESC ^0x9ePMプライベートメッセージ廃止済みです。Ghostty は無視します。

CSI

CSI シーケンスは、C1 シーケンスの中で圧倒的に最も一般的な種類です。 整数パラメーターをコロン(:)か セミコロン(;)で区切って使い、カーソルの移動、ターミナルモードの設定、上下のスクロール、 セルと行の挿入・削除、セルのスタイル変更などを行います。

主な制限は、整数値しかエンコードできないことです。 文字列データのエンコードには OSC や DCS といった別のシーケンス種別が必要です。

CSI シーケンスは次の形式に従います。CSI シーケンスの例は ESC [ 1 ; 2 m です。

csi_sequence = "0x1B" "[" params intermediates final
params = param | param sep params
param = [0-9]
sep = ";" | ":"
intermediates = [0x20-0x2F]*
final = [0x40-0x7E]

OSC

OSC シーケンスは、文字列やその他の整数以外のデータをエンコードし、 ターミナルとアプリケーションの間でやり取りするのに使われます。主にターミナルエミュレーター自体に 関する変数(タイトル、パレット、 クリップボードなど)を変更したり、ハイパーリンク、進捗レポート、 カレントディレクトリなどの追加機能を指示したりします。

この柔軟性から、OSC シーケンスはモダンな拡張で 非常に多く使われ、古いターミナルが単純に無視できる新しい機能を提供します。

OSC シーケンスは OSC(ESC ] または 0x9d)で始まります。その後、慣例として 操作を識別する整数が続きます

OSC シーケンスの形式は次のとおりです。慣例として、OSC シーケンスは整数識別子の後に セミコロン(;)が続く形で識別されますが、標準で必須とされたことはありません。一部の廃止済み OSC シーケンスはセミコロンの前に非数字の識別子を使いますが、 Ghostty はこれらをサポートしていません。

Note

さらに込み入った歴史的経緯により、xterm(ひいては Ghostty)の OSC シーケンスは、標準の文字列終端子 (ST、ESC \ または 0x9c)ではなくベル文字 (BEL、0x07)で終端されることがあります。

たいていの場合は互換に使えますが、古いプログラムやターミナルとの互換性を最大限に保つため、Ghostty は 応答時に OSC シーケンスで使われた終端子をそのまま返そうとします。標準準拠の観点から、 新しいコードでは常に ST を優先すべきです。

です。OSC シーケンスの例は OSC 2 ; 👻 Ghostty 👻 ST(ST は 文字列終端子)です。

osc_sequence = "0x1B" "]" data terminator
data = [0x20-0xFF]
terminator = "0x1B" "0x5C"

DCS

DCS シーケンスは、CSI シーケンスと OSC シーケンスを合わせたようなものです: 整数パラメーターと文字列値を両方サポートします。DCS シーケンスの例は DCS + P q <string> ST です。

dsc_sequence = "0x1B" "P" params intermediates final data ST
params = param | param ";" params
param = [0-9]
intermediates = [0x20-0x2F]*
final = [0x40-0x7E]
data = [0x20-0xFF]
ST = "0x1B" "0x5C"

APC

Ghostty は APC シーケンスに対応しています。現在サポートされている APC シーケンスは Kitty Graphics Protocol のシーケンスのみです。詳しくは こちら を参照してください。

apc_sequence = "0x1B" "_" data ST
data = [0x20-0xFF]
ST = "0x1B" "0x5C"

SOS と PM

SOS と PM のシーケンスは、Ghostty によって完全に無視されます。

sos_sequence = "0x1B" "X" data ST
pm_sequence = "0x1B" "^" data ST
data = [0x20-0xFF]
ST = "0x1B" "0x5C"