控制序列
控制序列是程式與終端機互動的一種方式。
控制序列用於移動游標、變更文字顏色、清除畫面等操作。它們是 程式與終端機互動的主要方式。
在終端機中執行的程式只有一種與終端機溝通的方式: 向所連接的檔案描述子寫入位元組(通常是偽終端機,簡稱 “pty”)。 為了區分要顯示的文字與要執行的命令, 終端機使用一套統稱為控制序列的特殊語法。
每種類型的控制序列都有不同的格式和用途。 它們的特定語法在下方說明。 參考 包含按類型分組的受支援 控制序列完整清單。
每個控制序列都以一個特殊的、不可列印的字元開頭,稱為控制字元。
最簡單的控制字元,稱為 C0 控制字元,位於 ASCII
編碼的 0x00 到 0x20 之間,且除自身外不接受任何參數。
控制字元非常少,但知道它們的存在很重要, 因為單個位元組值就會影響終端機狀態。
對終端機模擬有意義的 C0 字元包括:
| C0 | 縮寫 | 全名 | 功能 |
|---|---|---|---|
0x07 | BEL | 鈴聲 | 提請使用者注意。 |
0x08 | BS | 倒退鍵 | 將游標向後移動一個位置。 |
0x09 | TAB | 定位 | 將游標向右移動到下一個定位停駐點。 |
0x0A | LF | 換行 | 將游標向下移動一列。 |
0x0D | CR | 復歸 | 將游標移動到最左欄。 |
C0 字元之一,逸出(0x1b、ESC),很特殊。它既可啟動幾種離散的序列,
也可以開啟一整族序列,這也是控制序列在習慣上
(pars pro toto)也被稱為逸出序列的原因。
並非所有以逸出字元開頭的序列都是這裡定義的逸出序列
(它們更可能是 C1 序列),
但像 ESC D 這樣真正的逸出序列採用下面的格式。
esc_sequence = "0x1B" intermediates final
intermediates = [0x20-0x2F]*
final = [0x30-0x7E]
當逸出字元的後面接某些可列印字元時,由於各種歷史原因,它們會被一起解釋為 C1 控制字元,
其中一些負責構成統稱為 Fe 序列的許多序列家族。這些字元也可以用單個 8 位元字元表示,
但它們主要仍以逸出字元編碼,以避免與
現代終端機通常使用的 UTF-8 及其他高位元組編碼衝突。
| ESC 代碼 | C1 | 縮寫 | 全名 | 功能 |
|---|---|---|---|---|
ESC [ | 0x9b | CSI | 控制序列引導符 | 迄今為止最常見。使用整數來控制游標、畫面、模式、儲存格及其樣式。 |
ESC ] | 0x9d | OSC | 作業系統命令 | 常用於現代終端機擴充,用來傳送字串資料。 |
ESC P | 0x90 | DCS | 裝置控制序列 | 最常用於查詢終端機能力(XTGETTCAP)。其他情況下少見。 |
ESC _ | 0x9f | APC | 應用程式命令 | 用於 Kitty 圖形協定等需要任意資料的非常複雜的協定。 |
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 序列可以用鈴聲字元 (
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 序列類似於 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 圖形協定序列。相關文件在這裡。
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"