【问题标题】:Color text in terminal applications in UNIX [duplicate]UNIX中终端应用程序中的彩色文本[重复]
【发布时间】:2011-04-04 21:23:42
【问题描述】:

我开始编写终端文本编辑器,类似于 UNIX 的第一个文本编辑器,例如 vi。我唯一的目标是玩得开心,但我希望能够以彩色显示文本,这样我就可以使用语法高亮来编辑源代码。

我怎样才能做到这一点?是否有一些特殊的 POSIX API,或者我必须使用 ncurses? (我宁愿不要)

有什么建议吗?也许是一些关于 UNIX API 的教科书?

【问题讨论】:

  • 您可以改用 this simple method。与仅打印颜色相比,它也有一些优势。

标签: c unix terminal


【解决方案1】:

使用 ANSI 转义序列。 This article 详细介绍了它们。您也可以将它们与printf 一起使用。

【讨论】:

    【解决方案2】:

    你可能想要ANSI color codes。大多数 *nix 终端都支持它们。

    【讨论】:

      【解决方案3】:

      这是一个小 C 程序,说明如何使用颜色代码:

      #include <stdio.h>
      
      #define KNRM  "\x1B[0m"
      #define KRED  "\x1B[31m"
      #define KGRN  "\x1B[32m"
      #define KYEL  "\x1B[33m"
      #define KBLU  "\x1B[34m"
      #define KMAG  "\x1B[35m"
      #define KCYN  "\x1B[36m"
      #define KWHT  "\x1B[37m"
      
      int main()
      {
          printf("%sred\n", KRED);
          printf("%sgreen\n", KGRN);
          printf("%syellow\n", KYEL);
          printf("%sblue\n", KBLU);
          printf("%smagenta\n", KMAG);
          printf("%scyan\n", KCYN);
          printf("%swhite\n", KWHT);
          printf("%snormal\n", KNRM);
      
          return 0;
      }
      

      【讨论】:

      • printf(KMAG "magenta\n"); 比使用 %s 更干净、更快捷。
      • 这会将默认颜色永远设置为这个新的文本颜色。要将其设置回原来的使用 KNRM。
      • @Schroeder #define RESET "\033[0m",然后是printf(KMAG "magenta RESET \n");
      • 更好,puts( KMAG "magenta" RESET ) ;
      • @mf_ 您输入的内容可能不是您的意思......您输入的内容将不起作用,因为引号内的内容不由预处理器处理。
      【解决方案4】:

      我觉得更优雅的不同解决方案

      这是另一种方法。有些人会更喜欢这个,因为代码更干净一些。没有 %sRESET 颜色来结束着色。

      #include <stdio.h>
      
      #define RED   "\x1B[31m"
      #define GRN   "\x1B[32m"
      #define YEL   "\x1B[33m"
      #define BLU   "\x1B[34m"
      #define MAG   "\x1B[35m"
      #define CYN   "\x1B[36m"
      #define WHT   "\x1B[37m"
      #define RESET "\x1B[0m"
      
      int main() {
        printf(RED "red\n"     RESET);
        printf(GRN "green\n"   RESET);
        printf(YEL "yellow\n"  RESET);
        printf(BLU "blue\n"    RESET);
        printf(MAG "magenta\n" RESET);
        printf(CYN "cyan\n"    RESET);
        printf(WHT "white\n"   RESET);
      
        return 0;
      }
      

      这个程序给出以下输出:


      具有多种颜色的简单示例

      这样,很容易做这样的事情:

      printf("This is " RED "red" RESET " and this is " BLU "blue" RESET "\n");
      

      此行产生以下输出:

      【讨论】:

      • KNRM 和 RESET 一样吧?
      • 这实际上是一个好问题。我想你是对的,但我无法解释为什么。我的意思是,是完全相同的代码以不同的格式还是具有相同行为的不同代码?
      • 是的,根据您的示例,它们的格式略有不同(\x1B 和 \033),但它们的行为是相同的。
      • 我找到了解释:十进制 ASCII 码 27 是 escape 字符。 27 的八进制版本是 33 (\033),其十六进制版本是 1B (\x1B)(参考:wiki.bash-hackers.org/scripting/terminalcodes)。所以是的,有相同的。发现这个错误做得很好,感谢您的反馈。我现在就修复它;)。
      • 这种语法对我来说是新的“printf("Name:" NAME);"。它只适用于常量?
      猜你喜欢
      • 2021-07-18
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多