我有一个程序可以将内容记录到STDOUT。
STDOUT
这些日志条目具有关联的“日志级别”(调试,警告,信息等),我希望使用户能够根据日志级别对输出进行着色。
确定是否STDOUT连接到具有彩色功能的终端的方法是什么?那我该如何用颜色输出文本呢?
我正在寻找仅涉及C或C ++调用的解决方案。我猜curses(或ncurses)可以缓解这种情况,但是我想避免使用它来将依赖关系降到最低。
curses
ncurses
最简单的检查方法可能是:
isatty(fileno(STDOUT))
如果将1您的标准输出发送到任何类型的终端,将返回此值。实际上,任何终端都将支持或忽略VT100颜色代码。除非您希望将其输出到某些非常不寻常的硬件终端,否则无需检查terminfo。(其中大多数都已经几十年了。)
1
要输出颜色,请使用(扩展的)SGR序列:
"\x1b[%dm"
其中%d是常用颜色的以下值之一:
%d
0: reset colors/style 1: bold 4: underline 30 - 37: black, red, green, yellow, blue, magenta, cyan, and white text 40 - 47: black, red, green, yellow, blue, magenta, cyan, and white background
还有更多的价值,但是这些是最广泛支持的价值。同样,对于这些控制代码来说,检查terminfo基本上是不必要的,因为值得其支持的每个软件终端都将支持(或忽略)它们。
如果需要一次更改多个属性,则可以一次指定所有属性,以分号分隔。例如,以下序列将在绿色背景上用深红色的洋红色文字吸引您的眼球:
"\x1b[1;35;42m"