ANSI 转义序列是一种用于控制终端输出的色彩、样式、光标位置以及控制终端行为的特殊字节. 它的使用方式就是通过 stdout 在字符串、字节中向外输出**Control当终端支持此转义序列的功能时, 就会呈现出相应的效果. 此功能常常用于终端的彩色输出、构建 Text User Interface 应用等.ANSI 转义序列在 Linux、 MacOS 的各终端下得到了广泛运用, 但是在 Windows 系统上支持不佳. 不过 Microsoft 新出的 microsoft/terminal 很好地支持了 ANSI 转义序列, 现在就有了足够的动力去学习它了.ANSI 转义序列使用 ASCII 码为 0x1b 的字节作为转义字符, 而不是通常使用的反斜杠转义符 (0x5c), 这个字符是非打印字符, 被称为 ESC. 它在大多数编程语言中可以使用 x1b 或 e 来输入.转义序列采用了 x1b[<code><tail> 这样的格式.其中 x1b[ 被称作 Control Sequence Introducer , 简称 CSI, 它是大多数 ANSI 转义序列的开头. 而字符 <tail> 则用于标志一个转义序列的结尾, 不同的 tail 对应不同功能. 在这两个组件之间的部分 <code>, 则是转义序列的具体内容.
字符渲染序列(SGR)
字符渲染序列用来描述此序列之后的字符在终端中的呈现格式. 它采用字母 m 作为结尾. 在中间的 code 部分, 可以使用 ; 分号来分隔不同的样式码.它的形式类似于 x1b[31;43m, 这样的 CSI 也被称为 Select Graphic Rendition (SGR) 序列.大多数终端支持 4 bit 色彩与 8 种样式:# 前景色代码F_BLACK = 30F_RED = 31F_GREEN = 32F_YELLOW = 33F_BLUE = 34F_PURPLE = 35F_LIGHTBLUE = 36F_WHITE = 37# 背景色代码B_BLACK = 40B_RED = 41B_GREEN = 42B_YELLOW = 43B_BLUE = 44B_PURPLE = 45B_LIGHTBLUE = 46B_WHITE = 47# 效果代码X_NULL = 0 # 清空X_BOLD = 1 # 加粗X_LIGHT = 2 # 浅色X_ITALIC = 3# 斜体X_UNDERLINE = 4 # 下划线X_BLINK = 5 # 闪烁X_NEGA = 7 # 负片X_TRANSPARENT = 8 # 透明例如, x1b[31;43m Hello World x1b[0m 将会呈现为黄底红字的 Hello World. 在 CSI 与 其他组件之间并不需要空格, 这里的空格仅仅是为了方便阅读.在末尾的 x1b[0m 将会清空样式, 由于 CSI 将会影响之后的所有输出, 如果不清空的话, 会导致之后的所有输出都具有此样式.有些终端可接受 8 bit 256 色, 这被称作 “True Color”, 现代终端模拟器甚至可以支持 24bit 颜色, 已经是标准的图像颜色支持了.要使用 256 色, 以这样的形式输出x1b[38:5:<code>m 前景色x1b[48:5:<code>m 背景色其码表可以参考 /wiki/ANSI_escape_code#8-bit24bit 色彩使用 RGB 序列, 以这样的形式输出:x1b[38;2;<r>;<g>;<b>m前景色x1b[48;2;<r>;<g>;<b>m背景色
光标移动序列
转义序列作用CSI<n>A光标向上移动 n 行CSI<n>B光标向下移动 n 行CSI<n>C光标向前移动 n 列CSI<n>D光标向后移动 n 列CSI<n>;<m>H光标移动到第 n 行, 第 m 列
清屏指令
CSI<code>J 清空屏幕, 当 code 为:0: 清空光标以下区域1: 清空光标以上区域2: 清空全部CSI<code>K 清空行, 当 code 为:0: 清空光标之后区域1: 清空光标之前区域2: 清空整行
参考阅读
/p/69885819
/questions/4842424/list-of-ansi-color-escape-sequences
/wiki/ANSI_escape_code
使用ANSI Escape Code刷新控制行输出