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: hengch@163.com

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

whowin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值