Pour déterminer les capacités du terminal, consultez la base de données des capacités du terminal. voir termcap(5).
jrockway
1
N'hésitez pas à consulter un extrait de code que je mets ici . C'est un petit outil qui colore sa sortie à l'aide de quelques macros.
epatel
7
"La base de données termcap est une fonction obsolète pour décrire les capacités des terminaux et des imprimantes à cellules de caractères. Elle n'est conservée que pour les capacités avec les anciens programmes; les nouveaux devraient utiliser la terminfo(5)base de données et les bibliothèques associées." -termcap(5)
Si vous voulez faire des choses avancées avec l'impression couleur, je vous suggère de lire cet article. Je l'ai trouvé très utile
SubMachine
Réponses:
408
Vous devez sortir les codes couleurs ANSI . Notez que tous les terminaux ne le prennent pas en charge; si les séquences de couleurs ne sont pas prises en charge, les déchets s'affichent.
Exemple:
cout <<"\033[1;31mbold red text\033[0m\n";
Voici \033le caractère ESC, ASCII 27. Il est suivi par [, puis zéro ou plusieurs nombres séparés par ;, et enfin la lettre m. Les chiffres décrivent la couleur et le format à partir desquels basculer.
Les codes pour les couleurs de premier plan et d'arrière-plan sont les suivants:
foreground background
black 3040
red 3141
green 3242
yellow 3343
blue 3444
magenta 3545
cyan 3646
white 3747
De plus, vous pouvez les utiliser:
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
Consultez le tableau sur Wikipédia pour d'autres codes moins largement pris en charge.
Pour déterminer si votre terminal prend en charge les séquences de couleurs, lisez la valeur de la TERMvariable d'environnement. Il doit préciser le type de terminal particulier utilisé (par exemple vt100, gnome-terminal, xterm, screen, ...). Recherchez ensuite cela dans la base de données terminfo ; vérifier la colorscapacité.
Je l'utilise en définissant des "manipulateurs", comme const std::string red("\033[0;31m");ou const std::string reset("\033[0m");. Ensuite, je peux écrire simplement cout << red << "red text" << reset << endl;.
J'ai écrit une classe C ++ qui peut être utilisée pour définir la couleur de premier plan et d'arrière-plan de la sortie. Cet exemple de programme sert d'exemple d'impression This ->word<- is red.et de mise en forme afin que la couleur de premier plan de wordsoit rouge.
#include"colormod.h"// namespace Color#include<iostream>usingnamespace std;int main(){Color::Modifier red(Color::FG_RED);Color::Modifier def(Color::FG_DEFAULT);
cout <<"This ->"<< red <<"word"<< def <<"<- is red."<< endl;}
Vous voudrez peut-être ajouter des fonctionnalités supplémentaires à la classe. Il est par exemple possible d'ajouter la couleur magenta et même des styles comme boldface . Pour ce faire, juste une autre entrée à l' Codeénumération. Ceci est une bonne référence.
Si vous définissez operator<<pour Code, vous pouvez directement écrire std::cout << Color::FG_RED;au lieu de std::cout << Modifier(Color::FG_RED);. Autrement dit, Modifierne serait pas nécessaire.
Nawaz
2
@Nawaz Bonne idée. Voici une implémentation comme celle-ci: pastebin.com/zWC3t9hC . Cependant, je garderai mon implémentation d'origine dans la réponse car je pense qu'elle est plus extensible.
Joel Sjögren
1
En fait, j'aime mieux la première implémentation car vous pouvez ajouter un indicateur pour activer ou désactiver les couleurs: ajoutez bool sh;à la classe et changez le constructeur en Modifier (Code pCode, bool show = true) : code(pCode), sh(show) {}. Enfin, dans le corps de l' <<opérateur retourne la ligne courante if (sh)et return << os;autrement. Cela permet d'écrire votre code avec Color::Modifier red(Color::FG_RED, BoolVar);où vous pouvez définir BoolVarcomme vrai ou faux comme une initialisation du programme. Vous pouvez l'activer pour le voir à l'écran et le désactiver pour rediriger vers un fichier.
rpsml
42
Avant de sortir une couleur, vous devez vous assurer que vous êtes dans un terminal:
[-t 1]&& echo 'Yes I am in a terminal'# isatty(3) call in C
Ensuite, vous devez vérifier la capacité du terminal s'il prend en charge la couleur
sur les systèmes avec terminfo(basé sur Linux), vous pouvez obtenir une quantité de couleurs
Number_Of_colors_Supported=$(tput colors)
sur les systèmes avec termcap(basé sur BSD), vous pouvez obtenir la quantité de couleurs
Number_Of_colors_Supported=$(tput Co)
Ensuite, prenez votre décision:
[ ${Number_Of_colors_Supported}-ge 8]&&{
echo 'You are fine and can print colors'}||{
echo 'Terminal does not support color'}
BTW, n'utilisez pas la coloration comme cela a été suggéré auparavant avec les caractères ESC. Utilisez la capacité d'appel standard vers le terminal qui vous attribuera des couleurs CORRECTES que ce terminal prend en charge.
Basé sur BSD
fg_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)"
N'est-ce pas spécifique à bash? -t 1 ne fonctionnera évidemment pas en C ++, et appeler ce programme tput le rendra très détourné lorsqu'il est dans un programme C ++.
Macha
2
@Macha, oui, [ -t 1 ]c'est spécifique à sh / bash, mais sur le côté droit après le #(comment)signe, il y a une fonction C qui fait de même. man 3 isattydevrait aider à ce sujet;) Exemple montré comme des commandes shell pour simplifier l'explication du point principal. En ce qui concerne tputson utilitaire source OPEN pour interroger l'interface de capacité de terminal standard.
Alex
1
Je ne sais pas pourquoi les gens continuent de suggérer d'utiliser ces codes directement. C'est vraiment, vraiment une mauvaise pratique de faire de telles hypothèses. Même s'il s'agit d'un code spécifique au shell, il peut être traduit par toute personne ayant même une expérience novice du shell.
osirisgothra
34
Comme d'autres l'ont dit, vous pouvez utiliser des caractères d'échappement. Vous pouvez utiliser mon en-tête pour vous faciliter la tâche:
#ifndef _COLORS_
#define _COLORS_
/* FOREGROUND */#define RST "\x1B[0m"#define KRED "\x1B[31m"#define KGRN "\x1B[32m"#define KYEL "\x1B[33m"#define KBLU "\x1B[34m"#define KMAG "\x1B[35m"#define KCYN "\x1B[36m"#define KWHT "\x1B[37m"#define FRED(x) KRED x RST
#define FGRN(x) KGRN x RST
#define FYEL(x) KYEL x RST
#define FBLU(x) KBLU x RST
#define FMAG(x) KMAG x RST
#define FCYN(x) KCYN x RST
#define FWHT(x) KWHT x RST
#define BOLD(x)"\x1B[1m" x RST
#define UNDL(x)"\x1B[4m" x RST
#endif/* _COLORS_ */
Un exemple utilisant les macros de l'en-tête pourrait être:
Avec ces informations, il est facile de coloriser une chaîne "Je suis une banane!" avec la couleur de fond "Jaune" et la couleur de fond "Vert" comme ceci
C'est beaucoup mieux et je peux l'utiliser dans mon extension PHP C ++.
Aftab Naveed
12
C'est un vieux sujet, mais j'ai écrit une classe avec des sous-classes imbriquées et des membres statiques pour les couleurs définies par de simples macros C.
J'ai obtenu la colorfonction de ce poste Color Text In C Programming dans dreamincode.net par l'utilisateur no2pencil.
Je l'ai fait de cette façon afin de pouvoir utiliser les constantes statiques dans le flux std :: cout comme ceci:
cout << zkr::cc::fore::red <<"This is red text. "<< zkr::cc::console <<"And changing to console default colors, fg, bg."<< endl;
La classe et un code source du programme de test peuvent être téléchargés ici .
cc::consoleréinitialisera les couleurs et les attributs par défaut de la console, cc::underlinesoulignera le texte, qui fonctionne sur le mastic que j'ai testé le programme de test.
Couleurs:
black
blue
red
magenta
green
cyan
yellow
white
lightblack
lightblue
lightred
lightmagenta
lightgreen
lightcyan
lightyellow
lightwhite
Ce qui peut être utilisé avec les deux foreet les backsous - classes statiques de la ccclasse statique.
EDIT 2017
J'ajoute juste le code de classe ici pour être plus pratique.
et la fonction de couleur principale qui définit une couleur ou un attribut à l'écran:
char*cc::color(int attr,int fg,int bg){staticchar command[13];/* Command is the control command to the terminal */
sprintf(command,"%c[%d;%d;%dm",0x1B, attr, fg +30, bg +40);return command;}
ccolor.h
#include<stdio.h>#define CC_CONSOLE_COLOR_DEFAULT "\033[0m"#define CC_FORECOLOR(C)"\033["#C "m"#define CC_BACKCOLOR(C)"\033["#C "m"#define CC_ATTR(A)"\033["#A "m"namespace zkr
{class cc
{public:class fore
{public:staticconstchar*black;staticconstchar*blue;staticconstchar*red;staticconstchar*magenta;staticconstchar*green;staticconstchar*cyan;staticconstchar*yellow;staticconstchar*white;staticconstchar*console;staticconstchar*lightblack;staticconstchar*lightblue;staticconstchar*lightred;staticconstchar*lightmagenta;staticconstchar*lightgreen;staticconstchar*lightcyan;staticconstchar*lightyellow;staticconstchar*lightwhite;};class back
{public:staticconstchar*black;staticconstchar*blue;staticconstchar*red;staticconstchar*magenta;staticconstchar*green;staticconstchar*cyan;staticconstchar*yellow;staticconstchar*white;staticconstchar*console;staticconstchar*lightblack;staticconstchar*lightblue;staticconstchar*lightred;staticconstchar*lightmagenta;staticconstchar*lightgreen;staticconstchar*lightcyan;staticconstchar*lightyellow;staticconstchar*lightwhite;};staticchar*color(int attr,int fg,int bg);staticconstchar*console;staticconstchar*underline;staticconstchar*bold;};}
//// COLORS.h//// Posted by Gon1332 May 15 2015 on StackOverflow// /programming/2616906/how-do-i-output-coloured-text-to-a-linux-terminal#2616912//// Description: An easy header file to make colored text output to terminal second nature.// Modified by Shades Aug. 14 2018// PLEASE carefully read comments before using this tool, this will save you a lot of bugs that are going to be just about impossible to find.#ifndef COLORS_h
#define COLORS_h
/* FOREGROUND */// These codes set the actual text to the specified color#define RESETTEXT "\x1B[0m"// Set all colors back to normal.#define FOREBLK "\x1B[30m"// Black#define FORERED "\x1B[31m"// Red#define FOREGRN "\x1B[32m"// Green#define FOREYEL "\x1B[33m"// Yellow#define FOREBLU "\x1B[34m"// Blue#define FOREMAG "\x1B[35m"// Magenta#define FORECYN "\x1B[36m"// Cyan#define FOREWHT "\x1B[37m"// White/* BACKGROUND */// These codes set the background color behind the text.#define BACKBLK "\x1B[40m"#define BACKRED "\x1B[41m"#define BACKGRN "\x1B[42m"#define BACKYEL "\x1B[43m"#define BACKBLU "\x1B[44m"#define BACKMAG "\x1B[45m"#define BACKCYN "\x1B[46m"#define BACKWHT "\x1B[47m"// These will set the text color and then set it back to normal afterwards.#define BLK(x) FOREBLK x RESETTEXT
#define RED(x) FORERED x RESETTEXT
#define GRN(x) FOREGRN x RESETTEXT
#define YEL(x) FOREYEL x RESETTEXT
#define BLU(x) FOREBLU x RESETTEXT
#define MAG(x) FOREMAG x RESETTEXT
#define CYN(x) FORECYN x RESETTEXT
#define WHT(x) FOREWHT x RESETTEXT
// Example usage: cout << BLU("This text's color is now blue!") << endl;// These will set the text's background color then reset it back.#defineBackBLK(x) BACKBLK x RESETTEXT
#defineBackRED(x) BACKRED x RESETTEXT
#defineBackGRN(x) BACKGRN x RESETTEXT
#defineBackYEL(x) BACKYEL x RESETTEXT
#defineBackBLU(x) BACKBLU x RESETTEXT
#defineBackMAG(x) BACKMAG x RESETTEXT
#defineBackCYN(x) BACKCYN x RESETTEXT
#defineBackWHT(x) BACKWHT x RESETTEXT
// Example usage: cout << BACKRED(FOREBLU("I am blue text on a red background!")) << endl;// These functions will set the background to the specified color indefinitely.// NOTE: These do NOT call RESETTEXT afterwards. Thus, they will set the background color indefinitely until the user executes cout << RESETTEXT// OR if a function is used that calles RESETTEXT i.e. cout << RED("Hello World!") will reset the background color since it calls RESETTEXT.// To set text COLOR indefinitely, see SetFore functions below.#defineSetBackBLK BACKBLK
#defineSetBackRED BACKRED
#defineSetBackGRN BACKGRN
#defineSetBackYEL BACKYEL
#defineSetBackBLU BACKBLU
#defineSetBackMAG BACKMAG
#defineSetBackCYN BACKCYN
#defineSetBackWHT BACKWHT
// Example usage: cout << SetBackRED << "This text's background and all text after it will be red until RESETTEXT is called in some way" << endl;// These functions will set the text color until RESETTEXT is called. (See above comments)#defineSetForeBLK FOREBLK
#defineSetForeRED FORERED
#defineSetForeGRN FOREGRN
#defineSetForeYEL FOREYEL
#defineSetForeBLU FOREBLU
#defineSetForeMAG FOREMAG
#defineSetForeCYN FORECYN
#defineSetForeWHT FOREWHT
// Example usage: cout << SetForeRED << "This text and all text after it will be red until RESETTEXT is called in some way" << endl;#define BOLD(x)"\x1B[1m" x RESETTEXT // Embolden text then reset it.#define BRIGHT(x)"\x1B[1m" x RESETTEXT // Brighten text then reset it. (Same as bold but is available for program clarity)#define UNDL(x)"\x1B[4m" x RESETTEXT // Underline text then reset it.// Example usage: cout << BOLD(BLU("I am bold blue text!")) << endl;// These functions will embolden or underline text indefinitely until RESETTEXT is called in some way.#defineSetBOLD"\x1B[1m"// Embolden text indefinitely.#defineSetBRIGHT"\x1B[1m"// Brighten text indefinitely. (Same as bold but is available for program clarity)#defineSetUNDL"\x1B[4m"// Underline text indefinitely.// Example usage: cout << setBOLD << "I and all text after me will be BOLD/Bright until RESETTEXT is called in some way!" << endl;#endif/* COLORS_h */
Comme vous pouvez le voir, il a plus de fonctionnalités telles que la possibilité de définir la couleur d'arrière-plan temporairement, indéfiniment et d'autres fonctionnalités. Je pense aussi que c'est un peu plus convivial pour les débutants et plus facile à retenir de toutes les fonctions.
#include<iostream>#include"COLORS.h"int main(){
std::cout <<SetBackBLU<<SetForeRED<< endl;
std::cout <<"I am red text on a blue background! :) "<< endl;return0;}
Incluez simplement le fichier d'en-tête dans votre projet et vous êtes prêt à basculer avec la sortie du terminal coloré.
BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE
Format:
Format général, incluez la valeur souhaitée dans $ variable $
COLOR_$Foreground_Color$_$Background_Color$
COLOR_$Text_Attribute$_$Foreground_Color$_$Background_Color$
COLOR_NORMAL // To set color to default
par exemple
COLOR_BLUE_BLACK // Leave Text Attribute Blank if no Text Attribute appied
COLOR_UNDERSCORE_YELLOW_RED
COLOR_NORMAL
Usage:
Utilisez simplement pour diffuser la couleur souhaitée avant de sortir le texte et utilisez à nouveau pour définir la couleur à la normale après la sortie du texte.
La meilleure façon est d'utiliser la bibliothèque ncurses - bien que cela puisse être un marteau pour casser un écrou si vous voulez simplement sortir une chaîne de couleur simple
termcap(5)
.terminfo(5)
base de données et les bibliothèques associées." -termcap(5)
Réponses:
Vous devez sortir les codes couleurs ANSI . Notez que tous les terminaux ne le prennent pas en charge; si les séquences de couleurs ne sont pas prises en charge, les déchets s'affichent.
Exemple:
Voici
\033
le caractère ESC, ASCII 27. Il est suivi par[
, puis zéro ou plusieurs nombres séparés par;
, et enfin la lettrem
. Les chiffres décrivent la couleur et le format à partir desquels basculer.Les codes pour les couleurs de premier plan et d'arrière-plan sont les suivants:
De plus, vous pouvez les utiliser:
Consultez le tableau sur Wikipédia pour d'autres codes moins largement pris en charge.
Pour déterminer si votre terminal prend en charge les séquences de couleurs, lisez la valeur de la
TERM
variable d'environnement. Il doit préciser le type de terminal particulier utilisé (par exemplevt100
,gnome-terminal
,xterm
,screen
, ...). Recherchez ensuite cela dans la base de données terminfo ; vérifier lacolors
capacité.la source
m
/ représente?\033[
etm
marquez le début et la fin de la séquence d'échappement pour les codes de couleur ANSI. Ref: en.wikipedia.org/wiki/ANSI_escape_code#CSI_codesconst std::string red("\033[0;31m");
ouconst std::string reset("\033[0m");
. Ensuite, je peux écrire simplementcout << red << "red text" << reset << endl;
.Les bases
J'ai écrit une classe C ++ qui peut être utilisée pour définir la couleur de premier plan et d'arrière-plan de la sortie. Cet exemple de programme sert d'exemple d'impression
This ->word<- is red.
et de mise en forme afin que la couleur de premier plan deword
soit rouge.La source
Avancée
Vous voudrez peut-être ajouter des fonctionnalités supplémentaires à la classe. Il est par exemple possible d'ajouter la couleur magenta et même des styles comme boldface . Pour ce faire, juste une autre entrée à l'
Code
énumération. Ceci est une bonne référence.la source
operator<<
pourCode
, vous pouvez directement écrirestd::cout << Color::FG_RED;
au lieu destd::cout << Modifier(Color::FG_RED);
. Autrement dit,Modifier
ne serait pas nécessaire.bool sh;
à la classe et changez le constructeur enModifier (Code pCode, bool show = true) : code(pCode), sh(show) {}
. Enfin, dans le corps de l'<<
opérateur retourne la ligne couranteif (sh)
etreturn << os;
autrement. Cela permet d'écrire votre code avecColor::Modifier red(Color::FG_RED, BoolVar);
où vous pouvez définirBoolVar
comme vrai ou faux comme une initialisation du programme. Vous pouvez l'activer pour le voir à l'écran et le désactiver pour rediriger vers un fichier.Avant de sortir une couleur, vous devez vous assurer que vous êtes dans un terminal:
Ensuite, vous devez vérifier la capacité du terminal s'il prend en charge la couleur
sur les systèmes avec
terminfo
(basé sur Linux), vous pouvez obtenir une quantité de couleurssur les systèmes avec
termcap
(basé sur BSD), vous pouvez obtenir la quantité de couleursEnsuite, prenez votre décision:
BTW, n'utilisez pas la coloration comme cela a été suggéré auparavant avec les caractères ESC. Utilisez la capacité d'appel standard vers le terminal qui vous attribuera des couleurs CORRECTES que ce terminal prend en charge.
Basé sur BSD Basé sur Linux Utilisé commela source
[ -t 1 ]
c'est spécifique à sh / bash, mais sur le côté droit après le#(comment)
signe, il y a une fonction C qui fait de même.man 3 isatty
devrait aider à ce sujet;) Exemple montré comme des commandes shell pour simplifier l'explication du point principal. En ce qui concernetput
son utilitaire source OPEN pour interroger l'interface de capacité de terminal standard.Comme d'autres l'ont dit, vous pouvez utiliser des caractères d'échappement. Vous pouvez utiliser mon en-tête pour vous faciliter la tâche:
Un exemple utilisant les macros de l'en-tête pourrait être:
la source
J'utilise la solution suivante, elle est assez simple et élégante, peut être facilement collée dans la source et fonctionne sous Linux / Bash:
la source
D'après ma compréhension, un code couleur ANSI typique
est composé de (nom et codec)
FORMAT ATTRIBUTE
COULEUR DE FOND
COULEUR DE L'ARRIÈRE PLAN
TEXTE
RESET FORMAT ATTRIBUTE
Avec ces informations, il est facile de coloriser une chaîne "Je suis une banane!" avec la couleur de fond "Jaune" et la couleur de fond "Vert" comme ceci
Ou avec une bibliothèque C ++ colorize
Plus d'exemples avec FORMAT ATTRIBUTE ici
la source
C'est un vieux sujet, mais j'ai écrit une classe avec des sous-classes imbriquées et des membres statiques pour les couleurs définies par de simples macros C.
J'ai obtenu la
color
fonction de ce poste Color Text In C Programming dans dreamincode.net par l'utilisateur no2pencil.Je l'ai fait de cette façon afin de pouvoir utiliser les constantes statiques dans le flux std :: cout comme ceci:
La classe et un code source du programme de test peuvent être téléchargés ici .
cc::console
réinitialisera les couleurs et les attributs par défaut de la console,cc::underline
soulignera le texte, qui fonctionne sur le mastic que j'ai testé le programme de test.Couleurs:
Ce qui peut être utilisé avec les deux
fore
et lesback
sous - classes statiques de lacc
classe statique.EDIT 2017
J'ajoute juste le code de classe ici pour être plus pratique.
Les macros de code couleur:
et la fonction de couleur principale qui définit une couleur ou un attribut à l'écran:
ccolor.h
ccolor.cpp
la source
const char *cc::bold = CC_ATTR(1);
Vous pouvez utiliser des séquences d'échappement, si votre terminal le prend en charge. Par exemple:
la source
Une version étendue de l'en-tête de gon1332:
Comme vous pouvez le voir, il a plus de fonctionnalités telles que la possibilité de définir la couleur d'arrière-plan temporairement, indéfiniment et d'autres fonctionnalités. Je pense aussi que c'est un peu plus convivial pour les débutants et plus facile à retenir de toutes les fonctions.
Incluez simplement le fichier d'en-tête dans votre projet et vous êtes prêt à basculer avec la sortie du terminal coloré.
la source
essayez mon en-tête ici pour un moyen rapide et facile de colorer du texte: En-tête de couleur d'Aedi
En-tête-couleur-séquence-d'échappement
Colorez votre sortie sous Unix en utilisant C ++ !!
Options d'attribut de texte:
Options de couleur:
Format:
Format général, incluez la valeur souhaitée dans $ variable $
par exemple
Usage:
Utilisez simplement pour diffuser la couleur souhaitée avant de sortir le texte et utilisez à nouveau pour définir la couleur à la normale après la sortie du texte.
la source
Vous pouvez utiliser des codes couleurs ANSI.
utiliser ces fonctions.
la source
La meilleure façon est d'utiliser la bibliothèque ncurses - bien que cela puisse être un marteau pour casser un écrou si vous voulez simplement sortir une chaîne de couleur simple
la source
sur OSX shell, cela fonctionne pour moi (dont 2 espaces devant "texte rouge"):
la source