Musíte zadat barevné kódy ANSI. Všimněte si, že ne všechny terminály to podporují; pokud barevné sekvence nejsou podporovány, objeví se nesmysl.
Příklad:
cout << "\033[1;31mbold red text\033[0m\n";
Zde \033
je znak ESC, ASCII 27. Za ním následuje [
, pak nula nebo více čísel oddělených ;
a nakonec písmeno m
. Čísla popisují barvu a formát, na který se od tohoto okamžiku přepne.
Kódy pro barvy popředí a pozadí jsou:
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
Kromě toho můžete použít tyto:
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
Další, méně podporované kódy naleznete v tabulce na Wikipedii.
Chcete-li zjistit, zda váš terminál podporuje barevné sekvence, přečtěte si hodnotu TERM
proměnná prostředí. Mělo by specifikovat konkrétní použitý typ terminálu (např. vt100
, gnome-terminal
, xterm
, screen
, ...). Pak to vyhledejte v databázi terminfo; zkontrolujte colors
schopnosti.
Než se pustíte do výstupu jakékoli barvy, musíte se ujistit, že jste v terminálu:
[ -t 1 ] && echo 'Yes I am in a terminal' # isatty(3) call in C
Poté musíte zkontrolovat kapacitu terminálu, zda podporuje barvu
na systémech s terminfo
(založeno na Linuxu) množství podporovaných barev můžete získat jako
Number_Of_colors_Supported=$(tput colors)
na systémech s termcap
(na základě BSD) množství podporovaných barev můžete získat jako
Number_Of_colors_Supported=$(tput Co)
Pak se rozhodněte:
[ ${Number_Of_colors_Supported} -ge 8 ] && {
echo 'You are fine and can print colors'
} || {
echo 'Terminal does not support color'
}
BTW, nepoužívejte barvení, jak bylo navrženo dříve u znaků ESC. Použijte standardní funkci volání do terminálu, která vám přiřadí SPRÁVNÉ barvy, které konkrétní terminál podporuje.
Na základě 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)"
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)"
Použít jakoecho -e "${fg_red} Red ${fg_green} Bull ${reset}"
Základy
Napsal jsem třídu C++, kterou lze použít k nastavení barvy popředí a pozadí výstupu. Tento ukázkový program slouží jako příklad tisku This ->word<- is red.
a jeho formátování tak, aby barva popředí byla word
je červená.
#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;
}
Zdroj
#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";
}
};
}
Pokročilé
Možná budete chtít do třídy přidat další funkce. Je například možné přidat barvu purpurovou a dokonce i styly jako tučné písmo . Chcete-li to provést, stačí další záznam do Code
výčet. Toto je dobrá reference.