我在写 xterm.js demo 的时候碰到 x1B[1;3;31mxterm.jsx1B[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 "
");
printf(ANSI_COLOR_GREEN "This text is GREEN!" ANSI_COLOR_RESET "
");
printf(ANSI_COLOR_YELLOW "This text is YELLOW!" ANSI_COLOR_RESET "
");
printf(ANSI_COLOR_BLUE "This text is BLUE!" ANSI_COLOR_RESET "
");
printf(ANSI_COLOR_MAGENTA "This text is MAGENTA!" ANSI_COLOR_RESET "
");
printf(ANSI_COLOR_CYAN "This text is CYAN!" ANSI_COLOR_RESET "
");
return 0;
}
在终端的运行结果如下图所示:
然后在我的项目使用,这样如下:
三、shell或C语言下的实现方法
我们知道,使用ls命令列出文件列表时,不同的文件类型会用不同的颜色显示。那么如何实现这样带颜色的文本输出呢?答案并不复杂,不管是用shell还是C语言。
1、shell 下实现
先来讲在shell下,如何实现。用echo命令就可以实现,参看以下例子: echo -e " 33[32mHello, world!"
当你在终端里敲下这条命令后,是不是发现系统用绿色输出了"Hello,world!",不止如此,连之后的命令提示符都变成了绿色?不要着急,听我继续说。
echo 命令 -e 选项的作用是激活终端对反斜线转义符(即 )的解释。引号内 33 用于引导非常规字符序列,在这里的作用就是引导设置输出属性,后边的 [32m 就是将前景色设置为绿色,字母 m 表示设置的属性类别,数字代表属性值。设置可以单独使用,例如:echo -e " 33[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 " 33[20;1H 33[1;4;32mHello,world 33[0m"
这行命令首先 33[20;1H 将光标移动到终端第20行第1列,之后的 33[1;4;32m将文本属性设置为高亮、带下划线且颜色为绿色,然后输出Hello,world;最后 33[0m 将终端属性恢复为默认值,这样就不会看到连命令完成后的命令提示符也变了样儿了。
通过以上各种命令的组合就可以实现对终端输出地复杂控制。
2、C 编程下的实现
理解了以上在Shell中的实现方法,关于在C中如何实现就很简单了。可以说只需要用printf函数代替上边的echo -e就OK了。参见下例:
int color = 32;
printf("