Вывод цвета программы, запущенной под BASH

Мне нужно иметь возможность сделать какой-то текст на терминале более заметным, и я подумал, что текст должен быть цветным. Либо реальный текст, либо пробел в прямоугольнике каждой буквы (подумайте о курсоре vi). Единственными двумя дополнительными спецификациями, которые я считаю важными для моего приложения, являются: программа должна быть независимой от дистрибутивов (наверняка код будет выполняться только под BASH) и не должен выводить лишние символы при записи в файл. (либо из фактического кода, либо при передаче результатов)

Я искал в Интернете некоторую информацию, но я мог найти только информацию об устаревшем cstdlib (stdlib.h), и мне нужно (на самом деле, это скорее "желание") сделать это, используя функциональность iostream.

4 ответа

Решение

Большинство терминалов уважают цветовые последовательности 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";
}

Вот версия кода выше от @nightcracker, используя stringstream вместо itoa, (Это выполняется с использованием clang++, C++11, OS X 10.7, iTerm2, bash)

#include <iostream>
#include <string>
#include <sstream>

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

static std::string set_color(Color foreground = NONE, Color background = NONE)
{
    std::stringstream s;
    s << "\033[";
    if (!foreground && ! background){
        s << "0"; // reset colors if no params
    }
    if (foreground) {
        s << 29 + foreground;
        if (background) s << ";";
    }
    if (background) {
        s << 39 + background;
    }
    s << "m";
    return s.str();
}

int main(int agrc, char* argv[])
{
    std::cout << "These words should be colored [ " <<
        set_color(RED) << "red " <<
        set_color(GREEN) << "green " <<
        set_color(BLUE) << "blue" <<
        set_color() <<  " ]" << 
        std::endl;
    return EXIT_SUCCESS;
}

Возможно, вы захотите взглянуть на контрольные коды VT100.

Вы также можете сделать пользовательские функции, такие как:

void textcolor(int color)
{
    std::cout<<"\033]"<<color;
}

Для получения дополнительной информации читайте http://en.wikipedia.org/wiki/ANSI_escape_code

Вы можете использовать libcolor от github ( https://github.com/Spezialcoder/libcolor)

#include "libcolor/libcolor.h"
#include <iostream>
using namespace std; 
int main()
{
     cout << font_color::green << "Hello World" << endl;
}
Другие вопросы по тегам