ANSI 轉義序列

	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刷新控制行輸出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章