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


      我在写 xterm.js demo 的时候碰到 x1B[1;3;31mxterm.jsx1B[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 "
    ");
      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;1H33[1;4;32mHello,world33[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("33[20;1H33[1;4;%dmHello, world.33[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.')

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

  • 相关阅读:
    ajax是什么? ajax的交互模型? 同步和异步的区别? 如何解决跨域问题?
    集锦 比较好
    集锦
    伊甸园日历游戏
    晴天小猪历险记之Hill
    求无向图最小环算法
    旅行商简化版
    十字绣
    破坏石油运输系统问题
    强墙
  • 原文地址:https://www.cnblogs.com/goloving/p/15015053.html
Copyright © 2020-2023  润新知