控制序列

控制序列是程式與終端機互動的一種方式。

控制序列用於移動游標、變更文字顏色、清除畫面等操作。它們是 程式與終端機互動的主要方式。

在終端機中執行的程式只有一種與終端機溝通的方式: 向所連接的檔案描述子寫入位元組(通常是偽終端機,簡稱 “pty”)。 為了區分要顯示的文字與要執行的命令, 終端機使用一套統稱為控制序列的特殊語法。

每種類型的控制序列都有不同的格式和用途。 它們的特定語法在下方說明。 參考 包含按類型分組的受支援 控制序列完整清單。

C0 控制字元

每個控制序列都以一個特殊的、不可列印的字元開頭,稱為控制字元。 最簡單的控制字元,稱為 C0 控制字元,位於 ASCII 編碼的 0x00 到 0x20 之間,且除自身外不接受任何參數。

控制字元非常少,但知道它們的存在很重要, 因為單個位元組值就會影響終端機狀態。

對終端機模擬有意義的 C0 字元包括:

C0縮寫全名功能
0x07BEL鈴聲提請使用者注意。
0x08BS倒退鍵將游標向後移動一個位置。
0x09TAB定位將游標向右移動到下一個定位停駐點。
0x0ALF換行將游標向下移動一列。
0x0DCR復歸將游標移動到最左欄。

逸出序列

C0 字元之一,逸出(0x1b、ESC),很特殊。它既可啟動幾種離散的序列, 也可以開啟一整族序列,這也是控制序列在習慣上 (pars pro toto)也被稱為逸出序列的原因。

並非所有以逸出字元開頭的序列都是這裡定義的逸出序列 (它們更可能是 C1 序列), 但像 ESC D 這樣真正的逸出序列採用下面的格式。

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

Fe 序列

當逸出字元的後面接某些可列印字元時,由於各種歷史原因,它們會被一起解釋為 C1 控制字元, 其中一些負責構成統稱為 Fe 序列的許多序列家族。這些字元也可以用單個 8 位元字元表示, 但它們主要仍以逸出字元編碼,以避免與 現代終端機通常使用的 UTF-8 及其他高位元組編碼衝突。

ESC 代碼C1縮寫全名功能
ESC [0x9bCSI控制序列引導符迄今為止最常見。使用整數來控制游標、畫面、模式、儲存格及其樣式。
ESC ]0x9dOSC作業系統命令常用於現代終端機擴充,用來傳送字串資料。
ESC P0x90DCS裝置控制序列最常用於查詢終端機能力(XTGETTCAP)。其他情況下少見。
ESC _0x9fAPC應用程式命令用於 Kitty 圖形協定等需要任意資料的非常複雜的協定。
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 序列可以用鈴聲字元 (BEL、0x07)來結束,而非標準字串終止符 (ST、ESC \ 或 0x9c)。

雖然在大多數情況下它們可以互換使用,但 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 圖形協定序列。相關文件在這裡。

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"