Necesita generar códigos de color ANSI. Tenga en cuenta que no todos los terminales admiten esto; si las secuencias de colores no son compatibles, aparecerá basura.
Ejemplo:
cout << "\033[1;31mbold red text\033[0m\n";
Aquí, \033
es el carácter ESC, ASCII 27. Le sigue [
, luego cero o más números separados por ;
, y finalmente la letra m
. Los números describen el color y el formato para cambiar a partir de ese punto.
Los códigos para los colores de primer plano y de fondo son:
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
Además, puede utilizar estos:
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
Consulte la tabla en Wikipedia para conocer otros códigos menos compatibles.
Para determinar si su terminal admite secuencias de colores, lea el valor del TERM
Variable ambiental. Debe especificar el tipo de terminal particular utilizado (por ejemplo, vt100
, gnome-terminal
, xterm
, screen
, ...). Luego busque eso en la base de datos terminfo; revisa el colors
capacidad.
Antes de imprimir cualquier color, asegúrese de estar en una terminal:
[ -t 1 ] && echo 'Yes I am in a terminal' # isatty(3) call in C
Luego, debe verificar la capacidad del terminal si admite color
en sistemas con terminfo
(basado en Linux) puede obtener la cantidad de colores admitidos como
Number_Of_colors_Supported=$(tput colors)
en sistemas con termcap
(basado en BSD) puede obtener la cantidad de colores admitidos como
Number_Of_colors_Supported=$(tput Co)
Entonces toma tu decisión:
[ ${Number_Of_colors_Supported} -ge 8 ] && {
echo 'You are fine and can print colors'
} || {
echo 'Terminal does not support color'
}
Por cierto, no use colores como se sugirió antes con los caracteres ESC. Use la capacidad estándar de llamada a terminal que le asignará los colores CORRECTOS que admite el terminal en particular.
Basado en 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)"
Basado en 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)"
Usar comoecho -e "${fg_red} Red ${fg_green} Bull ${reset}"
Conceptos básicos
He escrito una clase de C++ que se puede usar para establecer el color de fondo y de primer plano de la salida. Este programa de muestra sirve como ejemplo de cómo imprimir This ->word<- is red.
y formateándolo para que el color de primer plano de word
es rojo.
#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;
}
Fuente
#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";
}
};
}
Avanzado
Es posible que desee agregar funciones adicionales a la clase. Es posible, por ejemplo, añadir el color magenta e incluso estilos como negrita . Para hacer esto, basta con otra entrada al Code
enumeración. Esta es una buena referencia.