2012-03-30 14 views
10

Ich muss in der Lage sein, etwas Text am Terminal auffälliger zu machen, und was ich dachte, war, den Text farbig zu machen. Entweder der eigentliche Text oder der Platz im Rechteck-Dings (denken Sie an den Cursor). Die einzigen zwei zusätzlichen Spezifikationen, die ich für meine Anwendung für wichtig halte, sind: das Programm sollte unabhängig von der Distribution sein (eine Gewissheit ist, dass der Code nur unter BASH ausgeführt wird) und beim Schreiben in eine Datei keine zusätzlichen Zeichen ausgeben (entweder aus dem tatsächlichen Code, oder wenn die Ausgabe der Pipeline)Farbausgabe des Programms unter BASH

Ich suchte im Internet nach Informationen, aber ich konnte nur Informationen für die veraltete cstdlib (stdlib.h) finden, und ich brauche (eigentlich, es ist mehr von ein "will"), um es mit der Funktionalität von iostream zu tun.

Antwort

12

Die meisten Terminals respektieren die ASCII-Farbsequenzen. Sie arbeiten, indem sie ESC, gefolgt von [, dann eine semikolon-getrennte Liste von Farbwerten, dann m ausgeben. Dies sind die gemeinsamen Werte:

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 

So "\033[31;47m" Ausgeben sollte das Terminal Front (Text) Farbe Rot und die Hintergrundfarbe weiß machen.

Sie können es schön in einer Form ++ C wickeln:

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

Sie den Abschluss nicht vergessen ' 'm'' der Sequenz, wie' "\ 033] 31; 47m" '. –

+0

@JoachimPileborg: behoben. – orlp

4

ist, lesen Sie hier eine Version der Code oben von @nightcracker, mit stringstream anstelle von itoa. (Diese läuft Klirren mit ++, 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; 
} 
Verwandte Themen