在不使用 ncurses 的情况下在 C 中进行与终端无关的彩色打印
Terminal-agnostic color printing in C without using ncurses
我正在编写一个输出测试结果的 C 程序,我希望它能以彩色打印出来,这样更容易浏览结果。我最初只使用 ANSI 颜色代码(根据 ),但代码审阅者希望它更独立于终端并建议改用 ncurses。
使用ncurses的问题是我的C程序输出的测试结果夹杂着其他bash脚本的测试结果。像这样:
Test Name | Result
------------------------------
1+1 == 2 | PASS <-- outputted by a C executable
!(!true) == true | PASS <-- outputted by a bash script
0+0 == 0 | PASS <-- outputted by a C executable
...
所以我不能使用常规的 ncurses 屏幕 - 我必须很好地处理其他输出。
bash 脚本使用 tput
和 setaf
进行彩色打印,但我不确定是否可以在 C 上下文中使用这些工具而不直接查找并调用 tput
可执行文件...
有没有什么方法可以在不使用 ncurses 的情况下在 C 中进行与终端无关的彩色打印?
猜猜看,tput 实际上是底层 ncurses C 库的一部分!
下面是使用 tput 打印彩色文本的示例。不要忘记使用 -lncurses
.
进行编译
#include <stdio.h>
#include <curses.h>
#include <term.h>
int main()
{
// first you need to initialize your terminal
int result = setupterm(0, 1, 0);
if (result != 0) {
return result;
}
printf("%-62.62s ", "1+1 == 2");
// set color to green. You can pass a different function instead
// of putchar if you want to, say, set the stderr color
tputs(tparm(tigetstr("setaf"), COLOR_GREEN), 1, putchar);
// set text to bold
tputs(tparm(tigetstr("bold")), 1, putchar);
// this text will be printed as green and bold
printf("PASS\n");
// reset text attributes
tputs(tparm(tigetstr("sgr0")), 1, putchar);
// now this text won't be green and bold
printf("Done\n");
}
如您所见,您可以自由地将 tput 内容与常规 printf 输出混合搭配。无需创建 curses 屏幕。
有关 tputs
、tparm
等的更多信息,请点击此处:https://invisible-island.net/ncurses/man/curs_terminfo.3x.html
这里列出了您的终端可能具有的 tigetstr
功能:https://invisible-island.net/ncurses/man/terminfo.5.html#h3-Predefined-Capabilities
我正在编写一个输出测试结果的 C 程序,我希望它能以彩色打印出来,这样更容易浏览结果。我最初只使用 ANSI 颜色代码(根据 ),但代码审阅者希望它更独立于终端并建议改用 ncurses。
使用ncurses的问题是我的C程序输出的测试结果夹杂着其他bash脚本的测试结果。像这样:
Test Name | Result
------------------------------
1+1 == 2 | PASS <-- outputted by a C executable
!(!true) == true | PASS <-- outputted by a bash script
0+0 == 0 | PASS <-- outputted by a C executable
...
所以我不能使用常规的 ncurses 屏幕 - 我必须很好地处理其他输出。
bash 脚本使用 tput
和 setaf
进行彩色打印,但我不确定是否可以在 C 上下文中使用这些工具而不直接查找并调用 tput
可执行文件...
有没有什么方法可以在不使用 ncurses 的情况下在 C 中进行与终端无关的彩色打印?
猜猜看,tput 实际上是底层 ncurses C 库的一部分!
下面是使用 tput 打印彩色文本的示例。不要忘记使用 -lncurses
.
#include <stdio.h>
#include <curses.h>
#include <term.h>
int main()
{
// first you need to initialize your terminal
int result = setupterm(0, 1, 0);
if (result != 0) {
return result;
}
printf("%-62.62s ", "1+1 == 2");
// set color to green. You can pass a different function instead
// of putchar if you want to, say, set the stderr color
tputs(tparm(tigetstr("setaf"), COLOR_GREEN), 1, putchar);
// set text to bold
tputs(tparm(tigetstr("bold")), 1, putchar);
// this text will be printed as green and bold
printf("PASS\n");
// reset text attributes
tputs(tparm(tigetstr("sgr0")), 1, putchar);
// now this text won't be green and bold
printf("Done\n");
}
如您所见,您可以自由地将 tput 内容与常规 printf 输出混合搭配。无需创建 curses 屏幕。
有关 tputs
、tparm
等的更多信息,请点击此处:https://invisible-island.net/ncurses/man/curs_terminfo.3x.html
这里列出了您的终端可能具有的 tigetstr
功能:https://invisible-island.net/ncurses/man/terminfo.5.html#h3-Predefined-Capabilities