C UNIX终端应用程序中的彩色文本

C UNIX终端应用程序中的彩色文本,c,unix,terminal,C,Unix,Terminal,我开始编写一个终端文本编辑器,类似于UNIX的第一个文本编辑器,如vi。我唯一的目标是玩得开心,但我希望能够以彩色显示文本,这样我就可以在编辑源代码时突出显示语法 我怎样才能做到这一点?是否有一些特殊的POSIXAPI用于此,或者我必须使用ncurses?(我宁愿不要) 有什么建议吗?也许有些关于UNIX API的教科书使用ANSI转义序列。详细介绍了他们的情况。您也可以将它们与printf一起使用。您可能需要。大多数*nix终端都支持它们。这是一个小C程序,演示了如何使用颜色代码: #incl

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

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


有什么建议吗?也许有些关于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");