制御シーケンス
制御シーケンスは、プログラムがターミナルとやり取りするための手段です。
制御シーケンスは、カーソルの移動、テキストの色の変更、画面の消去などに使われます。これらは プログラムがターミナルとやり取りする主な手段です。
ターミナル内で動作するプログラムがターミナルと通信できる方法は 1 つだけです: 接続されたファイルディスクリプター(通常は擬似ターミナル、略して「pty」)への バイトの書き込みです。表示すべきテキストと実行すべきコマンドを 区別するため、ターミナルは制御シーケンスと総称される 特殊な構文を使います。
制御シーケンスの種類ごとに、異なる形式と目的があります。 それぞれの具体的な構文とともに以下で説明します。 リファレンス には、種類ごとにまとめられたサポートされる 制御シーケンスの完全な一覧があります。
すべての制御シーケンスは、制御文字と呼ばれる、印字できない特殊な文字で始まります。最も単純な制御文字である
C0 制御文字は、ASCII エンコーディングの 0x00〜0x20 の
範囲にあり、自身以外のパラメーターを取りません。
制御文字の数はごく少ないですが、その 1 バイトの値がターミナルの状態に 影響するため、重要です。
ターミナルエミュレーションにとって意味のある C0 文字は次のとおりです:
| C0 | 略称 | 全名 | 機能 |
|---|---|---|---|
0x07 | BEL | ベル | ユーザーの注意を促します。 |
0x08 | BS | バックスペース | カーソルを 1 つ後ろへ移動します。 |
0x09 | TAB | タブ | カーソルを次のタブストップへ右へ移動します。 |
0x0A | LF | 改行 | カーソルを 1 行下へ移動します。 |
0x0D | CR | 復帰 | カーソルを最左列へ移動します。 |
C0 文字のひとつ、エスケープ(0x1b、ESC)は特殊です。いくつかの個別のシーケンスを
開始することもできれば、シーケンスの一族全体を始めることもできます。これが
制御シーケンスが pars pro toto(部分による全体)として通称
エスケープシーケンスとも呼ばれる理由です。
エスケープで始まるすべてのシーケンスがここで定義するエスケープシーケンスであるとは限らず
(多くは C1 シーケンス です)、
ESC D のような真のエスケープシーケンスは以下の形式をとります。
esc_sequence = "0x1B" intermediates final
intermediates = [0x20-0x2F]*
final = [0x30-0x7E]
エスケープの後に特定の印字可能文字が続くと、いくつかのややこしい歴史的経緯から
C1 制御文字としてまとめて解釈されます。その一部は、Fe シーケンスと
総称される多くのシーケンスの族の担い手です。これらの文字は 1 バイトの 8 ビット文字で
表現することもできますが、モダンなターミナルで普通に使われる UTF-8 などの
上位バイトのエンコーディングと衝突しないように、主にエスケープ文字でエンコードされたままです。
| ESC コード | C1 | 略称 | 全名 | 機能 |
|---|---|---|---|---|
ESC [ | 0x9b | CSI | 制御シーケンス導入子 | 圧倒的に最も一般的です。整数を使ってカーソル、画面、モード、セル、そのスタイルを制御します。 |
ESC ] | 0x9d | OSC | オペレーティングシステムコマンド | モダンなターミナル拡張で文字列データを伝送するのによく使われます。 |
ESC P | 0x90 | DCS | デバイス制御シーケンス | ターミナルのケイパビリティを照会するとき(XTGETTCAP)に最もよく使われます。それ以外ではまれです。 |
ESC _ | 0x9f | APC | アプリケーションプログラムコマンド | 任意のペイロードを必要とする Kitty Graphics Protocol などの非常に複雑なプロトコルで使われます。 |
ESC X | 0x98 | SOS | 文字列開始 | 廃止済みです。Ghostty は無視します。 |
ESC ^ | 0x9e | PM | プライベートメッセージ | 廃止済みです。Ghostty は無視します。 |
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(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 シーケンスは、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"
Ghostty は APC シーケンスに対応しています。現在サポートされている APC シーケンスは Kitty Graphics Protocol のシーケンスのみです。詳しくは こちら を参照してください。
apc_sequence = "0x1B" "_" data ST
data = [0x20-0xFF]
ST = "0x1B" "0x5C"
SOS と PM のシーケンスは、Ghostty によって完全に無視されます。
sos_sequence = "0x1B" "X" data ST
pm_sequence = "0x1B" "^" data ST
data = [0x20-0xFF]
ST = "0x1B" "0x5C"