2012-03-30 5 views
10

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

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

ответ

12

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

Не забывайте, заканчивающуюся ' 'm'' последовательности, как' "\ 033] 31; 47m" '. –

+0

@JoachimPileborg: исправлено. – orlp

0

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

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

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

4

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

#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; 
} 
Смежные вопросы