淺析 \x1B[1;3;31mxterm.js\x1B[0m 是什麼?如何在終端輸出帶顏色等格式的字串
我在寫 xterm.js demo 的時候碰到 \x1B[1;3;31mxterm.js\x1B[0m 這個,不知道是什麼,但是介面展示是紅色的斜體的 xterm.js 所以瞭解一下這個東西。
一、ANSI 轉義碼
如果可以在 terminal 上面印出各中顏色的字串,可以方便與迅速定位到關鍵資訊。
使用定義顏色的 ANSI 轉義碼。格式如下:
\x1b[(文字裝飾);(顏色程式碼):
1、文字裝飾
0 | 1 | 4 | 3 |
---|---|---|---|
正常 | 加粗 | 下劃線 | 背景 |
2、顏色程式碼
基本8色 | 基本高對比色 | xterm 的 256 色 |
---|---|---|
30 ~ 37 | 90 ~ 97 | 0 ~ 256 |
3、其它更多的顏色可以參考:
二、如何在終端輸出帶顏色等格式的字串
看別人的開源專案的時候發現,原來在終端可以列印帶顏色的字串的,只需要在待列印的字串前面和後面分別加一串修飾字符就行了。下面是C語言的一個例子:
#include <stdio.h>
#define ANSI_COLOR_RED "\x1b[31m"
#define ANSI_COLOR_GREEN "\x1b[32m"
#define ANSI_COLOR_YELLOW "\x1b[33m"
#define ANSI_COLOR_BLUE "\x1b[34m"
#define ANSI_COLOR_MAGENTA "\x1b[35m"
#define ANSI_COLOR_CYAN "\x1b[36m"
#define ANSI_COLOR_RESET "\x1b[0m"
int main() {
printf(ANSI_COLOR_RED "This text is RED!" ANSI_COLOR_RESET "\n");
printf(ANSI_COLOR_GREEN "This text is GREEN!" ANSI_COLOR_RESET "\n");
printf(ANSI_COLOR_YELLOW "This text is YELLOW!" ANSI_COLOR_RESET " \n");
printf(ANSI_COLOR_BLUE "This text is BLUE!" ANSI_COLOR_RESET "\n");
printf(ANSI_COLOR_MAGENTA "This text is MAGENTA!" ANSI_COLOR_RESET "\n");
printf(ANSI_COLOR_CYAN "This text is CYAN!" ANSI_COLOR_RESET "\n");
return 0;
}
在終端的執行結果如下圖所示:
然後在我的專案使用,這樣如下:
三、shell或C語言下的實現方法
我們知道,使用ls命令列出檔案列表時,不同的檔案型別會用不同的顏色顯示。那麼如何實現這樣帶顏色的文字輸出呢?答案並不複雜,不管是用shell還是C語言。
1、shell 下實現
先來講在shell下,如何實現。用echo命令就可以實現,參看以下例子: echo -e "\033[32mHello, world!"
當你在終端裡敲下這條命令後,是不是發現系統用綠色輸出了"Hello,world!",不止如此,連之後的命令提示符都變成了綠色?不要著急,聽我繼續說。
echo 命令 -e 選項的作用是啟用終端對反斜線轉義符(即 \ )的解釋。引號內 \033 用於引導非常規字元序列,在這裡的作用就是引導設定輸出屬性,後邊的 [32m 就是將前景色設定為綠色,字母 m 表示設定的屬性類別,數字代表屬性值。設定可以單獨使用,例如:echo -e "\033[0m",這行命令的作用是恢復屬性為預設值,也就是說 0m 設定項用於恢復預設值。現在你的終端是不是又一切正常了?
理解了這些,剩下的就簡單了。用這種命令,除了設定文字前景色,還可以設定很多屬性。下邊列出其他的設定項:
\033[0m 關閉所有屬性
\033[1m 設定高亮度
\033[4m 下劃線
\033[5m 閃爍
\033[7m 反顯
\033[8m 消隱
\033[30m 至 \33[37m 設定前景色
\033[40m 至 \33[47m 設定背景色
\033[nA 游標上移n行
\033[nB 游標下移n行
\033[nC 游標右移n行
\033[nD 游標左移n行
\033[y;xH設定游標位置
\033[2J 清屏
\033[K 清除從游標到行尾的內容
\033[s 儲存游標位置
\033[u 恢復游標位置
\033[?25l 隱藏游標
\033[?25h 顯示游標
各數字所代表的顏色如下:
字背景顏色範圍:40----49
40:黑
41:深紅
42:綠
43:黃色
44:藍色
45:紫色
46:深綠
47:白色
字顏色:30-----------39
30:黑
31:紅
32:綠
33:黃
34:藍色
35:紫色
36:深綠
37:白色
另外,同類的多種設定項可以組合在一起,中間用分號(;)隔開。如下:echo -e "\033[20;1H\033[1;4;32mHello,world\033[0m"
這行命令首先 \033[20;1H 將游標移動到終端第20行第1列,之後的\033[1;4;32m將文字屬性設定為高亮、帶下劃線且顏色為綠色,然後輸出Hello,world;最後 \033[0m 將終端屬性恢復為預設值,這樣就不會看到連命令完成後的命令提示符也變了樣兒了。
通過以上各種命令的組合就可以實現對終端輸出地複雜控制。
2、C 程式設計下的實現
理解了以上在Shell中的實現方法,關於在C中如何實現就很簡單了。可以說只需要用printf函式代替上邊的echo -e就OK了。參見下例:
int color = 32;
printf("\033[20;1H\033[1;4;%dmHello, world.\033[0m", color);
這個例子類似上邊shell中最後那個例子,只是這裡顏色值通過變數color來指定(當然,也可以直接指定)。
3、在其他程式語言裡也可以用類似的方法實現對終端輸出的控制,比如 js 裡
term.writeln("Welcome to \x1b[1;32m墨天輪\x1b[0m.")
term.writeln('This is Web Terminal of Modb; Good Good Study, Day Day Up.')
輸出效果就是我們上面看到的截圖效果。