浅析 \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.')
输出效果就是我们上面看到的截图效果。