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 = 30
F_RED = 31
F_GREEN = 32
F_YELLOW = 33
F_BLUE = 34
F_PURPLE = 35
F_LIGHTBLUE = 36
F_WHITE = 37
# 背景色代碼
B_BLACK = 40
B_RED = 41
B_GREEN = 42
B_YELLOW = 43
B_BLUE = 44
B_PURPLE = 45
B_LIGHTBLUE = 46
B_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 背景色
其碼錶可以參考 https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit
24bit 色彩使用 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: 清空整行
參考閱讀
https://zhuanlan.zhihu.com/p/69885819
https://stackoverflow.com/questions/4842424/list-of-ansi-color-escape-sequences
https://en.wikipedia.org/wiki/ANSI_escape_code
使用ANSI Escape Code刷新控制行輸出