控制序列

控制序列是程序与终端交互的一种方式。

控制序列用于移动光标、更改文本颜色、清屏等操作。它们是 程序与终端交互的主要方式。

在终端中运行的程序只有一种与终端通信的方式: 向所连接的文件描述符写入字节(通常是伪终端,简称 “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"