UNIX中终端应用程序中的彩色文本[重复]

Posted

技术标签:

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

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

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

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

【问题讨论】:

您可以改用 this simple method。与仅打印颜色相比,它也有一些优势。 【参考方案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);"。它只适用于常量?

以上是关于UNIX中终端应用程序中的彩色文本[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在python终端中打印颜色[重复]

推荐3个Python 文本终端 GUI 框架,太酷了

在终端上使用elinks下载github上单个文件

如何将所有终端输出记录/协议到python中的文本文件中[重复]

如何将彩色文本输出到 Linux 终端?

Html 到 ansi 彩色终端文本