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

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

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

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

165358 次浏览

使用 ANSI 转义序列。 这篇文章会详细介绍它们。你也可以把它们和 printf一起使用。

您可能需要 ANSI color codes。大多数 * 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;
}

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

还有一个办法。有些人会更喜欢这样,因为代码比较干净。没有 %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;
}

该方案的结果如下:

enter image description here


多种颜色的简单示例

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

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

这一行产生以下输出:

execution's output