ANSI的esc转义序列

·

5 min read

ANSI的esc转义序列

本文较完整第介绍了ANSI的转义序列,大多数都可以用于在普通终端上显示出较为漂亮的界面,本文可以作为一个资料备查。

CSI序列

  • CSI(Control Sequence Introducer)序列由 ESC [ 开始,后面跟若干个参数字节(可以没有),规定范围为 0x30-0x3F(ASCII 0–9:;<=>?);再跟若干个中间字节,规定范围为 0x20-0x2F(ASCII 空格以及!"#$%&'()*+,-./);然后再跟一个结束字符(单个字符),规定范围为 0x40-0x7E(ASCII @A–Z[\]^_`a–z{|}~)
组成部分字符范围ASCII
参数字节0x30–0x3F0–9:;<=>?
中间字节0x20–0x2F空格、!"#$%&'()*+,-./
最终字节0x40–0x7E@A–Z\[\]^_`a–z{}~
  • 常见的序列通常是把一些数字用分号分隔开,例如 1;2;3,缺少的数字视为 0(比如:1;;3被视为1;0;3),ESC[m 这样没有参数的情况相当于参数为 0;

  • 某些序列(如下表中的CUU - 光标上移一行)把0视为1,以使在缺少参数的情况下有意义;

  • 下表摘自维基百科中 CSI序列部分

  • 一些ANSI控制序列(不完整列表)

编号代码名称作用
1CSI n ACUU – 光标上移(Cursor Up)光标向指定的方向移动n(默认1)格。如果光标已在屏幕边缘,则无效
2CSI n BCUD – 光标下移(Cursor Down)同上
3CSI n CCUF – 光标前移(Cursor Forward)同上
4CSI n DCUB – 光标后移(Cursor Back)同上
5CSI n ECNL – 光标移到下一行(Cursor Next Line)光标移动到下面第n(默认1)行的开头。(非ANSI.SYS)
6CSI n FCPL – 光标移到上一行(Cursor Previous Line)光标移动到上面第n(默认1)行的开头。(非ANSI.SYS)
7CSI n GCHA – 光标水平绝对(Cursor Horizontal Absolute)光标移动到第n(默认1)列。(非ANSI.SYS)
8CSI n ; m HCUP – 光标位置(Cursor Position)光标移动到第n行、第m列。值从1开始,且默认为1(左上角)。例如CSI ;5H和CSI 1;5H含义相同;CSI 17;H、CSI 17H和CSI 17;1H三者含义相同
9CSI n JED – 擦除显示(Erase in Display)清除屏幕的部分区域。如果n是0(或缺失),则清除从光标位置到屏幕末尾的部分。如果n是1,则清除从光标位置到屏幕开头的部分。如果n是2,则清除整个屏幕(在DOS ANSI.SYS中,光标还会向左上方移动)。如果n是3,则清除整个屏幕,并删除回滚缓存区中的所有行(这个特性是xterm添加的,其他终端应用程序也支持)
10CSI n KEL – 擦除行(Erase in Line)清除行内的部分区域。如果n是0(或缺失),清除从光标位置到该行末尾的部分。如果n是1,清除从光标位置到该行开头的部分。如果n是2,清除整行,光标位置不变
11CSI n SSU – 向上滚动(Scroll Up)整页向上滚动n(默认1)行。新行添加到底部。(非ANSI.SYS)
12CSI n TSD – 向下滚动(Scroll Down)整页向下滚动n(默认1)行。新行添加到顶部。(非ANSI.SYS)
13CSI n ; m fHVP – 水平垂直位置(Horizontal Vertical Position)同CUP
14CSI n mSGR – 选择图形渲染(Select Graphic Rendition)设置SGR参数,包括文字颜色。CSI后可以是0或者更多参数,用分号分隔。如果没有参数,则视为CSI 0 m(重置/常规)
15CSI 5i打开辅助端口启用辅助串行端口,通常用于本地串行打印机
16CSI 4i关闭辅助端口禁用辅助串行端口,通常用于本地串行打印机
17CSI 6nDSR – 设备状态报告(Device Status Report)以ESC[n;mR(就像在键盘上输入)向应用程序报告光标位置(CPR),其中n是行,m是列
18CSI sSCP – 保存光标位置(Save Cursor Position)保存光标的当前位置
19CSI uRCP – 恢复光标位置(Restore Cursor Position)恢复保存的光标位置

SGR参数

  • SGR(Select Graphic Rendition)参数是ANSI转义序列中一组用于控制光标和字体的控制代码

  • 以下内容摘自维基百科中SGR参数部分

代码作用备注
0重置/正常关闭所有属性
1粗体或增加强度
2弱化(降低强度)未广泛支持
3斜体未广泛支持;有时视为反相显示
4下划线
5缓慢闪烁低于每分钟150次
6快速闪烁MS-DOS ANSI.SYS;每分钟150以上;未广泛支持
7反显前景色与背景色交换
8隐藏未广泛支持
9划除字符清晰,但标记为删除。未广泛支持
10主要(默认)字体
11–19替代字体选择替代字体n-10
20尖角体几乎无支持
21关闭粗体或双下划线关闭粗体未广泛支持;双下划线几乎无支持
22正常颜色或强度不强不弱
23非斜体、非尖角体
24关闭下划线去掉单双下划线
25关闭闪烁
27关闭反显
28关闭隐藏
29关闭划除
30–37设置前景色 参见下面的颜色表
38设置前景色下一个参数是5;n或2;r;g;b,见下
39默认前景色由具体实现定义(按照标准)
40–47设置背景色参见下面的颜色表
48设置背景色下一个参数是5;n或2;r;g;b,见下
49默认背景色由具体实现定义(按照标准)
51Framed
52Encircled
53上划线
54Not framed or encircled
55关闭上划线
60表意文字下划线或右边线几乎无支持
61表意文字双下划线或双右边线
62表意文字上划线或左边线
63表意文字双上划线或双左边线
64表意文字着重标志
65表意文字属性关闭重置60–64的所有效果
90–97设置明亮的前景色aixterm(非标准)
100–107设置明亮的背景色aixterm(非标准)

颜色编码

  • 以下内容摘自维基百科中颜色部分

  • 3bit 和 4bit 色彩

    • 因为最早的终端的颜色在硬件上只有 3bits,颜色只有 8 种,所以早期的规范中只给这 8 种颜色做了命名;SRG参数的 30-37 用于选择前景色,40-47 用于选择背景色;SGR 编码中 1 表示字体加粗,但那时许多终端并不是把粗体字(SGR码为 1)当成一个字体,而是使用更明亮的色彩来实现所谓"粗体",通常你无法把这种加亮的色彩用作背景色

    • 例如:使用 ESC[30;47m 是白底黑字的效果,使用 ESC[31m 变成红字,使用 ESC[1;31m 会变成加亮的红字;ESC[39;49m 将恢复到默认的前景、背景色(有些终端不支持),使用 ESC[0m 关闭所有属性也可以恢复默认设置

    • 后来随着技术的进步,终端都增加了直接设置高亮前景色和背景色的功能,前景色使用代码 90-97,背景色使用代码 100-107

    • 随着硬件的进步,开始使用 8bits 的 DAC(Digital-to-Analog Converters 数模转换器),许多软件开始使用 24bit 的颜色编码

颜色名称前景色代码背景色代码
3040
3141
绿3242
3343
3444
品红3545
3646
3747
亮黑(灰)90100
亮红91101
亮绿92102
亮黄93103
亮蓝94104
亮品红95105
亮青96106
亮白97107
  • 8bit 色彩

    • 随着 256 色的图形卡越来越普遍,相应的转义序列也跟着做了变更,可以从预定义的 256 种颜色中选择色彩

        ESC[38;5;⟨n⟩m ---- 选择前景色
        ESC[48;5;⟨n⟩m ---- 选择背景色
            0-  7:  标准色彩 (相当于 ESC [ 30–37 m)
            8- 15:  高亮色彩 (相当于 ESC [ 90–97 m)
        16-231:  6 × 6 × 6 RGB (216 种颜色): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5)
        232-255:  从黑到白工 24 级灰度
      
  • 24bit色彩

    • 随着有着 16-24bit 种颜色的"真彩"图像卡越来越普遍,应用程序开始支持 24bit 的色彩,Xterm 等终端仿真器开始支持使用转义序列设置24位前景和背景颜色

        ESC[ 38;2;⟨r⟩;⟨g⟩;⟨b⟩ m ---- 选择 RGB 前景色
        ESC[ 48;2;⟨r⟩;⟨g⟩;⟨b⟩ m ---- 选择 RGB 背景色
      

OSC 序列

  • 以下内容译自wikipediaOSC (Operating System Command) sequences

  • 在另一篇文章《关于bash下变量PS1的完整理解》会用到这个说明

  • 大多数 OSC(Operating System Command)序列都是由 Xterm 定义的,但许多其他仿真终端也支持 OSC 序列。由于历史原因,Xterm 可以使用 BEL(ASCII 007) 结束命令,也可以使用标准 ST(ESC ) 结束命令。例如,Xterm 允许使用 \033]0;window title\007 设置窗口标题


email: donation