Wie drucke ich farbige Zeichen auf einem Linux-Terminal, das dies unterstützt?
Wie kann ich feststellen, ob das Terminal Farbcodes unterstützt?
Wie drucke ich farbige Zeichen auf einem Linux-Terminal, das dies unterstützt?
Wie kann ich feststellen, ob das Terminal Farbcodes unterstützt?
Sie müssen Folgendes ausgeben ANSI-Farbcodes . Beachten Sie, dass nicht alle Terminals dies unterstützen; wenn Farbsequenzen nicht unterstützt werden, erscheint Müll.
Beispiel:
cout << "\033[1;31mbold red text\033[0m\n";
Hier, \033
ist das ESC-Zeichen, ASCII 27. Es wird gefolgt von [
, dann null oder mehr Zahlen, getrennt durch ;
und schließlich das Schreiben m
. Die Zahlen beschreiben die Farbe und das Format, zu dem ab diesem Zeitpunkt gewechselt wird.
Die Codes für Vorder- und Hintergrundfarben sind:
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
Zusätzlich können Sie diese verwenden:
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
Siehe die Tabelle auf Wikipedia für andere, weniger häufig unterstützte Codes.
Um festzustellen, ob Ihr Terminal Farbsequenzen unterstützt, lesen Sie den Wert des Parameters TERM
Umgebungsvariable. Sie sollte den verwendeten Terminaltyp angeben (z. B. vt100
, gnome-terminal
, xterm
, screen
, ...). Schauen Sie dann in der Terminfo-Datenbank ; überprüfen Sie die colors
Fähigkeit.
Ich habe eine C++-Klasse geschrieben, mit der man die Vorder- und Hintergrundfarbe der Ausgabe einstellen kann. Dieses Beispielprogramm dient als Beispiel für das Drucken This ->word<- is red.
und formatiert es so, dass die Vordergrundfarbe von word
ist rot.
#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;
}
#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";
}
};
}
Möglicherweise möchten Sie der Klasse zusätzliche Funktionen hinzufügen. So ist es zum Beispiel möglich, die Farbe Magenta und sogar Stile wie Fettschrift . Dazu müssen Sie lediglich einen weiteren Eintrag in der Code
Aufzählung. Diese ist eine gute Referenz.
Bevor Sie eine Farbe ausgeben, müssen Sie sicherstellen, dass Sie sich in einem Terminal befinden:
[ -t 1 ] && echo 'Yes I am in a terminal' # isatty(3) call in C
Dann müssen Sie prüfen, ob das Terminal Farbe unterstützt.
auf Systemen mit terminfo
(Linux-basiert) können Sie die Anzahl der unterstützten Farben erhalten als
Number_Of_colors_Supported=$(tput colors)
auf Systemen mit termcap
(BSD-basiert) können Sie die Anzahl der unterstützten Farben erhalten als
Number_Of_colors_Supported=$(tput Co)
Dann treffen Sie Ihre Entscheidung:
[ ${Number_Of_colors_Supported} -ge 8 ] && {
echo 'You are fine and can print colors'
} || {
echo 'Terminal does not support color'
}
Übrigens, verwenden Sie keine Farbgebung, wie es zuvor mit ESC-Zeichen vorgeschlagen wurde. Verwenden Sie den Standardaufruf an das Terminal, der Ihnen die korrekten Farben zuweist, die das jeweilige Terminal unterstützt.
BSD-basiert
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)"
Linux-basiert
fg_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)"
Verwendung als
echo -e "${fg_red} Red ${fg_green} Bull ${reset}"
Wie andere bereits erwähnt haben, können Sie Escape-Zeichen verwenden. Sie können verwenden meine Überschrift um es einfacher zu machen:
#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_ */
Ein Beispiel mit den Makros der Kopfzeile könnte sein:
#include <iostream>
#include "colors.h"
using namespace std;
int main()
{
cout << FBLU("I'm blue.") << endl;
cout << BOLD(FBLU("I'm blue-bold.")) << endl;
return 0;
}
Nach meinem Verständnis ist ein typischer ANSI-Farbcode
"\033[{FORMAT_ATTRIBUTE};{FORGROUND_COLOR};{BACKGROUND_COLOR}m{TEXT}\033[{RESET_FORMATE_ATTRIBUTE}m"
besteht aus (Name und Codec)
FORMATATTRIBUT
{ "Default", "0" },
{ "Bold", "1" },
{ "Dim", "2" },
{ "Italics", "3"},
{ "Underlined", "4" },
{ "Blink", "5" },
{ "Reverse", "7" },
{ "Hidden", "8" }
VORDERGRUNDFARBE
{ "Default", "39" },
{ "Black", "30" },
{ "Red", "31" },
{ "Green", "32" },
{ "Yellow", "33" },
{ "Blue", "34" },
{ "Magenta", "35" },
{ "Cyan", "36" },
{ "Light Gray", "37" },
{ "Dark Gray", "90" },
{ "Light Red", "91" },
{ "Light Green", "92" },
{ "Light Yellow", "93" },
{ "Light Blue", "94" },
{ "Light Magenta", "95" },
{ "Light Cyan", "96" },
{ "White", "97" }
HINTERGRUNDFARBE
{ "Default", "49" },
{ "Black", "40" },
{ "Red", "41" },
{ "Green", "42" },
{ "Yellow", "43" },
{ "Blue", "44" },
{ "Megenta", "45" },
{ "Cyan", "46" },
{ "Light Gray", "47" },
{ "Dark Gray", "100" },
{ "Light Red", "101" },
{ "Light Green", "102" },
{ "Light Yellow", "103" },
{ "Light Blue", "104" },
{ "Light Magenta", "105" },
{ "Light Cyan", "106" },
{ "White", "107" }
TEXT
FORMATATTRIBUT ZURÜCKSETZEN
{ "All", "0" },
{ "Bold", "21" },
{ "Dim", "22" },
{ "Underlined", "24" },
{ "Blink", "25" },
{ "Reverse", "27" },
{ "Hidden", "28" }
Mit diesen Informationen ist es einfach, eine Zeichenkette "Ich bin eine Banane!" mit der Vordergrundfarbe "Gelb" und der Hintergrundfarbe "Grün" wie folgt einzufärben
"\033[0;33;42mI am a Banana!\033[0m"
Oder mit einer C++-Bibliothek Einfärben
auto const& colorized_text = color::rize( "I am a banana!", "Yellow", "Green" );
std::cout << colorized_text << std::endl;
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.