ANSI转义序列
参考:https://zh.m.wikipedia.org/zh-hans/ANSI%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97
ANSI 转义序列(ANSI escape sequences)是一种带内信号(英语:In-band signaling)的转义序列标准,用于控制视频文本终端上的光标位置、颜色和其他选项。在文本中嵌入确定的字节序列,大部分以ESC
转义字符和”[“字符开始,终端会把这些字节序列解释为相应的指令,而不是普通的字符编码。
ANSI 序列是在二十世纪七十年代引入的标准,用以取代特定于终端供应商的序列,并在二十世纪八十年代早期开始在计算机设备市场上广泛使用。与早期缺少光标移动功能的系统相比,新生的电子公告板系统使用 ANSI 序列改进其显示。正是因为这个原因,ANSI 序列变成了所有制造商共同采用的标准。
在 21 世纪,尽管硬件文本终端已经越来越少了,但 ANSI 标准依然存在,因为大多数终端模拟器会对部分 ANSI 转义序列进行解释。一个值得注意的例外是,在微软Windows 10更新 TH2 之前,Windows 操作系统的Win32 控制台是不支持 ANSI 转义序列的。
转义序列
序列具有不同的长度。所有序列都以 ASCII 字符**[ESC](https://zh.m.wikipedia.org/wiki/退出键)**
(27 / 十六进制 0x1B)开头,第二个字节则是 0x40–0x5F(ASCII @A–Z[\]^_
)范围内的字符。[12]:5.3.a
一些 ANSI 转义序列(不完整列表)
序列 | **C1 | 名称 | 作用 |
---|---|---|---|
ESC [ | 0x9b | CSI - 控制序列导入器(Control Sequence Introducer) | 大部分有用的序列,请参阅下一节。结束于 ASCII 64 到 126 (@ 到~ /十六进制 0x40 到 0x7E).[12] |
… | … | … | … |
CSI
CSI 序列由ESC [
、若干个(包括 0 个)“参数字节”、若干个“中间字节”,以及一个“最终字节”组成。
所有常见的序列都只是把参数用作一系列分号分隔的数字,如1;2;3
。缺少的数字视为 0(如1;;3
相当于中间的数字是 0,ESC[m
这样没有参数的情况相当于参数为 0)。某些序列(如 CUU)把 0 视为 1,以使缺少参数的情况下有意义。
一些 ANSI 控制序列(不完整列表)
代码 | 名称 | 作用 |
---|---|---|
CSI n m |
SGR – 选择图形再现(Select Graphic Rendition) | 设置SGR 参数,包括文字颜色。CSI 后可以是 0 或者更多参数,用分号分隔。如果没有参数,则视为CSI 0 m (重置/常规)。 |
… | … | … |
选择图形再现(SGR)参数
代码 | 作用 | 备注 |
---|---|---|
0 | 重置/正常 | 关闭所有属性。 |
1 | 粗体或增加强度 | |
4 | 下划线 | |
5 | 缓慢闪烁 | 低于每分钟 150 次。 |
22 | 正常颜色或强度 | 不强不弱。 |
30–37 | 设置前景色 | 参见下面的颜色表。 |
38 | 设置前景色 | 下一个参数是5;n 或2;r;g;b ,见下。 |
39 | 默认前景色 | 由具体实现定义(按照标准)。 |
40–47 | 设置背景色 | 参见下面的颜色表。 |
48 | 设置背景色 | 下一个参数是5;n 或2;r;g;b ,见下。 |
49 | 默认背景色 | 由具体实现定义(按照标准)。 |
颜色
初始的规格只有 8 种颜色,只给了它们的名字。SGR 参数 30-37 选择前景色,40-47 选择背景色。相当多的终端将“粗体”(SGR 代码 1)实现为更明亮的颜色而不是不同的字体,从而提供了 8 种额外的前景色,但通常情况下并不能用于背景色,虽然有时候反显(SGR 代码 7)可以允许这样。例如:在白色背景上显示黑色文字使用ESC[30;47m
,显示红色文字用ESC[31m
,显示明亮的红色文字用ESC[1;31m
。重置为默认颜色用ESC[39;49m
(某些终端不支持),重置所有属性用ESC[0m
。后来的终端新增了功能,可以直接用 90-97 和 100-107 指定“明亮”的颜色。
字颜色:30———–37
1 | 30 黑 |
字背景颜色范围:40—-47
1 | 40 黑 |
字体加亮颜色:90————97
1 | 90 黑 |
背景加亮颜色范围:100——————–107
1 | 100 黑 |
ANSI 控制码的说明
1 | \033[0m # 关闭所有属性 |
在 vim 中应用
输入逃逸符^[ : ctrl + v + [
vim 中输入 ^[[1;31m123^[[0m
使用 cat 打印就是红色的 123