淺析 \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、其它更多的顏色可以參考:ANSI escape code

二、如何在終端輸出帶顏色等格式的字符串

  看別人的開源項目的時候發現,原來在終端可以打印帶顏色的字符串的,只需要在待打印的字符串前面和后面分別加一串修飾字符就行了。下面是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.')

  輸出效果就是我們上面看到的截圖效果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM