tangguo

在BASH下运行的程序的颜色输出

c

我需要能够使终端上的某些文本更引人注目,并且我认为是使文本变为彩色。实际的文本,或者每个字母的矩形中的空格(想想vi的光标)。我认为对我的应用程序很重要的两个额外规范是:该程序应与发行版无关(可以确定的是,该代码仅在BASH下运行),并且在写入文件时不应输出额外的字符。 (根据实际代码或管道输出时)

我在网上搜索了一些信息,但是我只能找到不推荐使用的cstdlib(stdlib.h)的信息,我需要(实际上,更多是“想要”)使用iostream的功能来完成此操作。


阅读 406

收藏
2020-11-05

共1个答案

一尘不染

大多数终端都遵循ASCII颜色序列。它们的工作方式是输出ESC,然后输出,[然后是分号分隔的颜色值列表,然后是m。这些是常见的值:

Special
0  Reset all attributes
1  Bright
2  Dim
4  Underscore   
5  Blink
7  Reverse
8  Hidden

Foreground colors
30  Black
31  Red
32  Green
33  Yellow
34  Blue
35  Magenta
36  Cyan
37  White

Background colors
40  Black
41  Red
42  Green
43  Yellow
44  Blue
45  Magenta
46  Cyan
47  White

因此,输出"\033[31;47m"应使终端正面(文本)颜色为红色,背景颜色为白色。

您可以将其很好地包装为C ++形式:

enum Color {
    NONE = 0,
    BLACK, RED, GREEN,
    YELLOW, BLUE, MAGENTA,
    CYAN, WHITE
}

std::string set_color(Color foreground = 0, Color background = 0) {
    char num_s[3];
    std::string s = "\033[";

    if (!foreground && ! background) s += "0"; // reset colors if no params

    if (foreground) {
        itoa(29 + foreground, num_s, 10);
        s += num_s;

        if (background) s += ";";
    }

    if (background) {
        itoa(39 + background, num_s, 10);
        s += num_s;
    }

    return s + "m";
}
2020-11-05