C UNIX终端应用程序中的彩色文本
我开始编写一个终端文本编辑器,类似于UNIX的第一个文本编辑器,如vi。我唯一的目标是玩得开心,但我希望能够以彩色显示文本,这样我就可以在编辑源代码时突出显示语法 我怎样才能做到这一点?是否有一些特殊的POSIXAPI用于此,或者我必须使用ncurses?(我宁愿不要)C UNIX终端应用程序中的彩色文本,c,unix,terminal,C,Unix,Terminal,我开始编写一个终端文本编辑器,类似于UNIX的第一个文本编辑器,如vi。我唯一的目标是玩得开心,但我希望能够以彩色显示文本,这样我就可以在编辑源代码时突出显示语法 我怎样才能做到这一点?是否有一些特殊的POSIXAPI用于此,或者我必须使用ncurses?(我宁愿不要) 有什么建议吗?也许有些关于UNIX API的教科书使用ANSI转义序列。详细介绍了他们的情况。您也可以将它们与printf一起使用。您可能需要。大多数*nix终端都支持它们。这是一个小C程序,演示了如何使用颜色代码: #incl
有什么建议吗?也许有些关于UNIX API的教科书使用ANSI转义序列。详细介绍了他们的情况。您也可以将它们与printf一起使用。您可能需要。大多数*nix终端都支持它们。这是一个小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;
}
#包括
#定义KNRM“\x1B[0m”
#定义KRED“\x1B[31m”
#定义KGRN“\x1B[32m”
#定义Kyle“\x1B[33m”
#定义KBLU“\x1B[34m”
#定义KMAG“\x1B[35m”
#定义KCYN“\x1B[36m”
#定义KWHT“\x1B[37m”
int main()
{
printf(“%sred\n”,KRED);
printf(“%sgreen\n”,KGRN);
printf(“%syellow\n”,凯尔);
printf(“%sblue\n”,KBLU);
printf(“%smagenta\n”,KMAG);
printf(“%scyan\n”,KCYN);
printf(“%swhite\n”,KWHT);
printf(“%snormal\n”,KNRM);
返回0;
}
我发现更优雅的不同解决方案
这是另一种方法。有些人会喜欢这种方法,因为代码比较干净。没有%s
和重置
颜色来结束着色
#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(KMAG“洋红”\n”)
比使用%s
干净得多,速度也快得多。这会将默认颜色永久设置为新文本颜色。若要将其设置回原始颜色,请使用KNRM。@Schroeder定义重置“\033[0m”
,然后printf(KMAG“洋红重置”\n”)
将(KMAG“洋红色”重置)@mf_;您键入的内容可能不是您的意思…您键入的内容不起作用,因为引号内的内容不由预处理器处理。KNRM与RESET是一样的,不是吗?这实际上是一个好问题。我想您是对的,但我无法解释原因。我的意思是,它是相同的代码、不同的格式还是不同的代码它们有相同的行为?是的,根据您的示例,它们的格式(\x1B和\033)略有不同,但它们的行为是相同的。我发现了解释:十进制ASCII码27是转义字符。27的八进制版本是33(\033),十六进制版本是1B(\x1B)(参考:)。因此,是的,有相同的。很好地发现了这个错误,感谢您的反馈。我现在就纠正它;)。这个语法对我来说是新的“printf”(“Name:”Name);”。它只适用于常量?您可以改为使用。它也比只打印颜色有一些优势。
printf("This is " RED "red" RESET " and this is " BLU "blue" RESET "\n");