控制序列
控制序列是程序与终端交互的一种方式。
控制序列用于移动光标、更改文本颜色、清屏等操作。它们是 程序与终端交互的主要方式。
在终端中运行的程序只有一种与终端通信的方式: 向所连接的文件描述符写入字节(通常是伪终端,简称 “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"