通過printf設置Linux終端輸出的顏色和顯示方式

通過printf設置Linux終端輸出的顏色和顯示方式

轉載自:http://www.cnblogs.com/clover-toeic/p/4031618.html

     在Linux終端下調試程序時,有時需要輸出大量信息。若能控制字體的顏色和顯示方式,可使輸出信息對比鮮明,便於調試時觀察數據。

     終端的字符顏色由轉義序列(Escape Sequence)控制,是文本模式下的系統顯示功能,與具體語言無關。

     轉義序列以控制字符'ESC'開頭。該字符的ASCII碼十進制表示爲27,十六進制表示爲0x1B,八進制表示爲033。多數轉義序列超過兩個字符,故通常以'ESC'和左括號'['開頭。該起始序列稱爲控制序列引導符(CSI,Control Sequence Intro),通常由'\033['或'\e['代替。

     通過轉義序列設置終端顯示屬性時,可採用以下格式:

     \033[ Param {;Param;...}m 或 \e[ Param {;Param;...}m

     其中,'\033['或'\e['引導轉義序列,'m'表示設置屬性並結束轉義序列。Param爲屬性值,{...}表示可選(多個參數之間用分號隔開,與順序無關)。

     注意,轉義序列可被控制字符'CAN'(Cancel )和'SUB'(Substitute)中斷。

     轉義序列相關的常用參數如下(通過man console_codes命令可查看更多的參數描述):

     顯示:0(默認)、1(粗體/高亮)、22(非粗體)、4(單條下劃線)、24(無下劃線)、5(閃爍)、25(無閃爍)、7(反顯、翻轉前景色和背景色)、27(無反顯)

     顏色:0(黑)、1(紅)、2(綠)、 3(黃)、4(藍)、5(洋紅)、6(青)、7(白)

     前景色爲30+顏色值,如31表示前景色爲紅色;背景色爲40+顏色值,如41表示背景色爲紅色。

     調色效果如下圖所示:

 

     因此,通過轉義序列設置終端顯示屬性時,常見格式爲:

     \033[顯示方式;前景色;背景色m輸出字符串\033[0m 或 \e[顯示方式;前景色;背景色m輸出字符串\033[0m

     此外,還有一些ANSI控制碼,如:nA (光標上移n行 )、nB(光標下移n行 )、nC(光標右移n行 )、nD (光標左移n行 )、2J(清屏)、K(清除從光標到行尾的內容)、s(保存光標位置)、u(恢復光標位置)、?25l(隱藏光標)、?25l(顯示光標)。     其中 ,'\033[0m'用於恢復默認的終端輸出屬性,否則會影響後續的輸出。

     基於常用參數,可定義如下單一控制宏,用於printf系列語句:

複製代碼
 1 #define NONE                 "\e[0m"
 2 #define BLACK                "\e[0;30m"
 3 #define L_BLACK              "\e[1;30m"
 4 #define RED                  "\e[0;31m"
 5 #define L_RED                "\e[1;31m"
 6 #define GREEN                "\e[0;32m"
 7 #define L_GREEN              "\e[1;32m"
 8 #define BROWN                "\e[0;33m"
 9 #define YELLOW               "\e[1;33m"
10 #define BLUE                 "\e[0;34m"
11 #define L_BLUE               "\e[1;34m"
12 #define PURPLE               "\e[0;35m"
13 #define L_PURPLE             "\e[1;35m"
14 #define CYAN                 "\e[0;36m"
15 #define L_CYAN               "\e[1;36m"
16 #define GRAY                 "\e[0;37m"
17 #define WHITE                "\e[1;37m"
18 
19 #define BOLD                 "\e[1m"
20 #define UNDERLINE            "\e[4m"
21 #define BLINK                "\e[5m"
22 #define REVERSE              "\e[7m"
23 #define HIDE                 "\e[8m"
24 #define CLEAR                "\e[2J"
25 #define CLRLINE              "\r\e[K" //or "\e[1K\r"
複製代碼

     編寫測試代碼驗證轉義序列控制的效果:

複製代碼
 1 int main(void)
 2 {
 3     printf("This is a character control test!\n" );
 4     sleep(3);
 5     printf("[%2u]" CLEAR "CLEAR\n" NONE, __LINE__);
 6 
 7     printf("[%2u]" BLACK "BLACK " L_BLACK "L_BLACK\n" NONE, __LINE__);
 8     printf("[%2u]" RED "RED " L_RED "L_RED\n" NONE, __LINE__);
 9     printf("[%2u]" GREEN "GREEN " L_GREEN "L_GREEN\n" NONE, __LINE__);
10     printf("[%2u]" BROWN "BROWN " YELLOW "YELLOW\n" NONE, __LINE__);
11     printf("[%2u]" BLUE "BLUE " L_BLUE "L_BLUE\n" NONE, __LINE__);
12     printf("[%2u]" PURPLE "PURPLE " L_PURPLE "L_PURPLE\n" NONE, __LINE__);
13     printf("[%2u]" CYAN "CYAN " L_CYAN "L_CYAN\n" NONE, __LINE__);
14     printf("[%2u]" GRAY "GRAY " WHITE "WHITE\n" NONE, __LINE__);
15 
16     printf("[%2u]\e[1;31;40m Red \e[0m\n",  __LINE__);
17 
18     printf("[%2u]" BOLD "BOLD\n" NONE, __LINE__);
19     printf("[%2u]" UNDERLINE "UNDERLINE\n" NONE, __LINE__);
20     printf("[%2u]" BLINK "BLINK\n" NONE, __LINE__);
21     printf("[%2u]" REVERSE "REVERSE\n" NONE, __LINE__);
22     printf("[%2u]" HIDE "HIDE\n" NONE, __LINE__);
23 
24     printf("Cursor test begins!\n" );
25     printf("=======!\n" );
26     sleep(10);
27     printf("[%2u]" "\e[2ACursor up 2 lines\n" NONE, __LINE__);
28     sleep(10);
29     printf("[%2u]" "\e[2BCursor down 2 lines\n" NONE, __LINE__);
30     sleep(5);
31     printf("[%2u]" "\e[?25lCursor hide\n" NONE, __LINE__);
32     sleep(5);
33     printf("[%2u]" "\e[?25hCursor display\n" NONE, __LINE__);
34     sleep(5);
35 
36     printf("Test ends!\n" );
37     sleep(3);
38     printf("[%2u]" "\e[2ACursor up 2 lines\n" NONE, __LINE__);
39     sleep(5);
40     printf("[%2u]" "\e[KClear from cursor downward\n" NONE, __LINE__);
41 
42     return 0 ;
43 }
複製代碼

     執行結果截圖如下:

轉載地址:http://www.cnblogs.com/frydsh/p/4139922.html

發佈了54 篇原創文章 · 獲贊 38 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章