È necessario emettere i codici colore ANSI. Si noti che non tutti i terminali lo supportano; se le sequenze di colori non sono supportate, verrà visualizzata la spazzatura.
Esempio:
cout << "\033[1;31mbold red text\033[0m\n";
Qui, \033
è il carattere ESC, ASCII 27. È seguito da [
, quindi zero o più numeri separati da ;
, e infine la lettera m
. I numeri descrivono il colore e il formato a cui passare da quel momento in poi.
I codici per i colori di primo piano e di sfondo sono:
foreground background
black 30 40
red 31 41
green 32 42
yellow 33 43
blue 34 44
magenta 35 45
cyan 36 46
white 37 47
Inoltre, puoi usare questi:
reset 0 (everything back to normal)
bold/bright 1 (often a brighter shade of the same colour)
underline 4
inverse 7 (swap foreground and background colours)
bold/bright off 21
underline off 24
inverse off 27
Consulta la tabella su Wikipedia per altri codici meno ampiamente supportati.
Per determinare se il tuo terminale supporta sequenze di colori, leggi il valore di TERM
variabile d'ambiente. Dovrebbe specificare il particolare tipo di terminale utilizzato (ad es. vt100
, gnome-terminal
, xterm
, screen
, ...). Quindi cercalo nel database terminfo; controlla il colors
capacità.
Prima di produrre qualsiasi colore di cui hai bisogno, assicurati di essere in un terminale:
[ -t 1 ] && echo 'Yes I am in a terminal' # isatty(3) call in C
Quindi devi verificare la capacità del terminale se supporta il colore
su sistemi con terminfo
(basato su Linux) puoi ottenere la quantità di colori supportati come
Number_Of_colors_Supported=$(tput colors)
su sistemi con termcap
(basato su BSD) puoi ottenere la quantità di colori supportati come
Number_Of_colors_Supported=$(tput Co)
Allora prendi la tua decisione:
[ ${Number_Of_colors_Supported} -ge 8 ] && {
echo 'You are fine and can print colors'
} || {
echo 'Terminal does not support color'
}
A proposito, non usare la colorazione come suggerito in precedenza con i caratteri ESC. Usa la funzionalità di chiamata standard al terminale che ti assegnerà i colori CORRETTI che quel particolare terminale supporta.
Basato su BSDfg_black="$(tput AF 0)"
fg_red="$(tput AF 1)"
fg_green="$(tput AF 2)"
fg_yellow="$(tput AF 3)"
fg_blue="$(tput AF 4)"
fg_magenta="$(tput AF 5)"
fg_cyan="$(tput AF 6)"
fg_white="$(tput AF 7)"
reset="$(tput me)"
Basato su Linuxfg_black="$(tput setaf 0)"
fg_red="$(tput setaf 1)"
fg_green="$(tput setaf 2)"
fg_yellow="$(tput setaf 3)"
fg_blue="$(tput setaf 4)"
fg_magenta="$(tput setaf 5)"
fg_cyan="$(tput setaf 6)"
fg_white="$(tput setaf 7)"
reset="$(tput sgr0)"
Usa comeecho -e "${fg_red} Red ${fg_green} Bull ${reset}"
Nozioni di base
Ho scritto una classe C++ che può essere utilizzata per impostare il colore di primo piano e di sfondo dell'output. Questo programma di esempio serve come esempio di stampa di This ->word<- is red.
e formattandolo in modo che il colore di primo piano di word
è rosso.
#include "colormod.h" // namespace Color
#include <iostream>
using namespace std;
int main() {
Color::Modifier red(Color::FG_RED);
Color::Modifier def(Color::FG_DEFAULT);
cout << "This ->" << red << "word" << def << "<- is red." << endl;
}
Fonte
#include <ostream>
namespace Color {
enum Code {
FG_RED = 31,
FG_GREEN = 32,
FG_BLUE = 34,
FG_DEFAULT = 39,
BG_RED = 41,
BG_GREEN = 42,
BG_BLUE = 44,
BG_DEFAULT = 49
};
class Modifier {
Code code;
public:
Modifier(Code pCode) : code(pCode) {}
friend std::ostream&
operator<<(std::ostream& os, const Modifier& mod) {
return os << "\033[" << mod.code << "m";
}
};
}
Avanzate
Potresti voler aggiungere ulteriori funzionalità alla classe. È, ad esempio, possibile aggiungere il colore magenta e persino stili come grassetto . Per fare questo basta inserire un'altra voce nel Code
enumerazione. Questo è un buon riferimento.