浅析 \x1B[1;3;31mxterm.js\x1B[0m 是什么?如何在终端输出带颜色等格式的字符串

  我在写 xterm.js demo 的时候碰到 \x1B[1;3;31mxterm.js\x1B[0m 这个,不知道是什么,但是界面展示是红色的斜体的 xterm.js 所以了解一下这个东西。

一、ANSI 转义码

  如果可以在 terminal 上面印出各中颜色的字符串,可以方便与迅速定位到关键信息。

  使用定义颜色的 ANSI 转义码。格式如下:

\x1b[(文字装饰);(颜色代码):

1、文字装饰

0143
正常 加粗 下划线 背景

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.')

  输出效果就是我们上面看到的截图效果。

posted @ 2021-07-15 14:13  古兰精  阅读(7286)  评论(0编辑  收藏  举报