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

Nis*_*nio 102 c unix terminal

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

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

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

kar*_*lip 167

这是一个小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;
}
Run Code Online (Sandbox Code Playgroud)

  • `printf(KMAG"magenta \n");`比使用`%s`更干净,更快. (92认同)
  • 这会将此默认颜色永久设置为此新文本颜色.将其重新设置为原来的雇用KNRM. (11认同)
  • @Schroeder`#define RESET"\ 033 [0m"`,然后`printf(KMAG"magenta RESET \n");` (5认同)
  • 更好的是,`puts(KMAG“ magenta” RESET);` (2认同)
  • @mf_ 您输入的内容可能不是您的意思……您输入的内容将不起作用,因为预处理器不处理引号内的内容。 (2认同)

Dav*_*yon 94

这是另一种方法.因为代码是有点清洁剂(有没有一些人会喜欢这种%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;
}
Run Code Online (Sandbox Code Playgroud)

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

printf("This is " RED "red" RESET " and this is " BLU "blue" RESET "\n");
Run Code Online (Sandbox Code Playgroud)

  • 我找到了解释:十进制ASCII码27是_escape_字符.25的八进制版本是33(\ 033),其十六进制版本是1B(\ x1B)(参考:http://wiki.bash-hackers.org/scripting/terminalcodes).所以,是的,有相同的.为找到这个错误做得很好,并感谢您的反馈.我现在就解决它;). (5认同)

nmi*_*els 18

您可能需要ANSI颜色代码.大多数*nix终端支持它们.


Viv*_*ath 15

使用ANSI转义序列.本文将详细介绍它们.你也可以使用它们printf.