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】:
我觉得更优雅的不同解决方案
这是另一种方法。有些人会更喜欢这个,因为代码更干净一些。没有 %s
和 RESET
颜色来结束着色。
#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中终端应用程序中的彩色文本[重复]的主要内容,如果未能解决你的问题,请参考以下文章