Чтобы определить, на что способен терминал, проверьте базу данных возможностей терминала. см termcap(5).
jrockway
1
Не стесняйтесь взглянуть на фрагмент кода, который я разместил здесь . Это небольшой инструмент, который окрашивает вывод с помощью некоторых макросов.
эпател
7
«База данных termcap является устаревшим средством для описания возможностей терминалов и принтеров символьных ячеек. Она сохраняется только для возможностей старых программ; новые должны использовать terminfo(5)базу данных и связанные библиотеки». -termcap(5)
Если вы хотите продвинуться с цветной печатью, советую прочитать эту статью. Я нашел это очень полезным
SubMachine
Ответы:
408
Вам необходимо вывести цветовые коды ANSI . Обратите внимание, что не все терминалы поддерживают это; если цветовые последовательности не поддерживаются, мусор будет отображаться.
Пример:
cout <<"\033[1;31mbold red text\033[0m\n";
Здесь \033- символ ESC, ASCII 27. За ним следует [, затем ноль или более цифр, разделенных ;, и, наконец, буква m. Числа описывают цвет и формат для переключения с этого момента.
Коды для цветов переднего плана и фона:
foreground background
black 3040
red 3141
green 3242
yellow 3343
blue 3444
magenta 3545
cyan 3646
white 3747
Кроме того, вы можете использовать эти:
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
Чтобы определить, поддерживает ли ваш терминал цветовые последовательности, прочитайте значение TERMпеременной среды. Необходимо указать конкретный тип терминала (например vt100, gnome-terminal, xterm, screen, ...). Затем найдите это в базе данных terminfo ; проверить colorsвозможность.
Я использую это определение "манипуляторы", такие как const std::string red("\033[0;31m");или const std::string reset("\033[0m");. Тогда я могу написать просто cout << red << "red text" << reset << endl;.
Я написал класс C ++, который можно использовать для установки цвета переднего плана и фона для вывода. Этот пример программы служит примером печати This ->word<- is red.и форматирования так, чтобы основной цвет был wordкрасным.
#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;}
Вы можете добавить дополнительные функции в класс. Например, можно добавить пурпурный цвет и даже такие стили, как жирный шрифт . Для этого просто еще одна запись в Codeперечислении. Это хорошая ссылка.
Если вы определите operator<<для Code, то вы можете напрямую написать std::cout << Color::FG_RED;вместо std::cout << Modifier(Color::FG_RED);. То есть Modifierне было бы необходимости.
Наваз
2
@ Наваз Хорошая идея. Вот такая реализация: pastebin.com/zWC3t9hC . Тем не менее, я оставлю свою исходную реализацию в ответе, потому что чувствую, что она более расширяема.
Джоэл Шегрен
1
На самом деле мне больше нравится первая реализация, так как вы можете добавить флаг для включения или выключения цветов: добавьте bool sh;в класс и измените конструктор на Modifier (Code pCode, bool show = true) : code(pCode), sh(show) {}. Наконец, в теле <<оператора вернуть текущую строку if (sh)и в return << os;противном случае. Это позволяет написать свой код, Color::Modifier red(Color::FG_RED, BoolVar);где вы можете установить значение BoolVartrue или false в качестве инициализации программы. Вы можете включить его, чтобы увидеть его на экране, и отключить, чтобы перенаправить в файл.
rpsml
42
Перед тем, как вывести любой цвет, убедитесь, что вы находитесь в терминале:
[-t 1]&& echo 'Yes I am in a terminal'# isatty(3) call in C
Затем вам нужно проверить работоспособность терминала, если он поддерживает цвет
в системах с terminfo(на основе Linux) количество поддерживаемых цветов можно получить как
Number_Of_colors_Supported=$(tput colors)
в системах с termcap(на основе BSD) количество поддерживаемых цветов можно получить как
Number_Of_colors_Supported=$(tput Co)
Тогда примите решение:
[ ${Number_Of_colors_Supported}-ge 8]&&{
echo 'You are fine and can print colors'}||{
echo 'Terminal does not support color'}
Кстати, не используйте раскраски, как это было предложено ранее с символами ESC. Используйте стандартную возможность вызова терминала, которая назначит вам ПРАВИЛЬНЫЕ цвета, которые поддерживает конкретный терминал.
Основанный на 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)"
Разве это не специфично для Bash? -t 1, очевидно, не будет работать в C ++, и вызов этой программы tput сделает ее очень обходной, когда в программе C ++.
Мача
2
@Macha, да, [ -t 1 ]это зависит от sh / bash, но справа от #(comment)знака есть функция C, которая делает то же самое. man 3 isattyдолжно помочь в этом;) Пример, показанный в виде команд оболочки, для упрощения объяснения основного момента. Как tputи в случае с открытой утилитой источника для запроса стандартного интерфейса возможностей терминала.
Алекс
1
Я не уверен, почему люди продолжают предлагать использовать эти коды напрямую. Это действительно очень плохая практика, чтобы делать такие предположения. Даже если это специфичный для оболочки код, он может быть переведен любым, даже начинающим пользователем, с опытом работы с оболочкой.
osirisgothra
34
Как уже говорили другие, вы можете использовать escape-символы. Вы можете использовать мой заголовок , чтобы сделать это проще:
#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_ */
Примером использования макросов заголовка может быть:
Я сделал это таким образом, чтобы иметь возможность использовать статические константы в потоке std :: cout следующим образом:
cout << zkr::cc::fore::red <<"This is red text. "<< zkr::cc::console <<"And changing to console default colors, fg, bg."<< endl;
Класс и исходный код тестовой программы можно скачать здесь .
cc::consoleсбросит цвета и атрибуты консоли по умолчанию, cc::underlineподчеркнет текст, который работает на шпатлевке, которую я тестировал в тестовой программе.
Цвета:
black
blue
red
magenta
green
cyan
yellow
white
lightblack
lightblue
lightred
lightmagenta
lightgreen
lightcyan
lightyellow
lightwhite
Который может использоваться как foreсо backстатическими подклассами, так и со ccстатическими классами.
РЕДАКТИРОВАТЬ 2017
Я просто добавляю код класса здесь, чтобы быть более практичным.
и основная функция цвета, которая определяет цвет или атрибут экрана:
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 */
Как вы можете видеть, он имеет больше возможностей, таких как возможность устанавливать цвет фона временно, на неопределенный срок и другие функции. Я также считаю, что это немного более удобно для начинающих и легче запомнить все функции.
#include<iostream>#include"COLORS.h"int main(){
std::cout <<SetBackBLU<<SetForeRED<< endl;
std::cout <<"I am red text on a blue background! :) "<< endl;return0;}
Просто включите заголовочный файл в свой проект, и вы готовы к работе с цветным терминалом.
termcap(5)
.terminfo(5)
базу данных и связанные библиотеки». -termcap(5)
Ответы:
Вам необходимо вывести цветовые коды ANSI . Обратите внимание, что не все терминалы поддерживают это; если цветовые последовательности не поддерживаются, мусор будет отображаться.
Пример:
Здесь
\033
- символ ESC, ASCII 27. За ним следует[
, затем ноль или более цифр, разделенных;
, и, наконец, букваm
. Числа описывают цвет и формат для переключения с этого момента.Коды для цветов переднего плана и фона:
Кроме того, вы можете использовать эти:
Смотрите таблицу в Википедии для других, менее широко поддерживаемых кодов.
Чтобы определить, поддерживает ли ваш терминал цветовые последовательности, прочитайте значение
TERM
переменной среды. Необходимо указать конкретный тип терминала (напримерvt100
,gnome-terminal
,xterm
,screen
, ...). Затем найдите это в базе данных terminfo ; проверитьcolors
возможность.источник
m
/ означает?\033[
иm
отметьте начало и конец escape-последовательности для цветовых кодов ANSI. Ссылка: en.wikipedia.org/wiki/ANSI_escape_code#CSI_codesconst std::string red("\033[0;31m");
илиconst std::string reset("\033[0m");
. Тогда я могу написать простоcout << red << "red text" << reset << endl;
.основы
Я написал класс C ++, который можно использовать для установки цвета переднего плана и фона для вывода. Этот пример программы служит примером печати
This ->word<- is red.
и форматирования так, чтобы основной цвет былword
красным.Источник
продвинутый
Вы можете добавить дополнительные функции в класс. Например, можно добавить пурпурный цвет и даже такие стили, как жирный шрифт . Для этого просто еще одна запись в
Code
перечислении. Это хорошая ссылка.источник
operator<<
дляCode
, то вы можете напрямую написатьstd::cout << Color::FG_RED;
вместоstd::cout << Modifier(Color::FG_RED);
. То естьModifier
не было бы необходимости.bool sh;
в класс и измените конструктор наModifier (Code pCode, bool show = true) : code(pCode), sh(show) {}
. Наконец, в теле<<
оператора вернуть текущую строкуif (sh)
и вreturn << os;
противном случае. Это позволяет написать свой код,Color::Modifier red(Color::FG_RED, BoolVar);
где вы можете установить значениеBoolVar
true или false в качестве инициализации программы. Вы можете включить его, чтобы увидеть его на экране, и отключить, чтобы перенаправить в файл.Перед тем, как вывести любой цвет, убедитесь, что вы находитесь в терминале:
Затем вам нужно проверить работоспособность терминала, если он поддерживает цвет
в системах с
terminfo
(на основе Linux) количество поддерживаемых цветов можно получить какв системах с
termcap
(на основе BSD) количество поддерживаемых цветов можно получить какТогда примите решение:
Кстати, не используйте раскраски, как это было предложено ранее с символами ESC. Используйте стандартную возможность вызова терминала, которая назначит вам ПРАВИЛЬНЫЕ цвета, которые поддерживает конкретный терминал.
Основанный на BSD На основе Linux Использовать какисточник
[ -t 1 ]
это зависит от sh / bash, но справа от#(comment)
знака есть функция C, которая делает то же самое.man 3 isatty
должно помочь в этом;) Пример, показанный в виде команд оболочки, для упрощения объяснения основного момента. Какtput
и в случае с открытой утилитой источника для запроса стандартного интерфейса возможностей терминала.Как уже говорили другие, вы можете использовать escape-символы. Вы можете использовать мой заголовок , чтобы сделать это проще:
Примером использования макросов заголовка может быть:
источник
Я использую следующее решение, оно довольно простое и элегантное, может быть легко вставлено в исходный код и работает в Linux / Bash:
источник
Насколько я понимаю, типичный цветовой код ANSI
состоит из (имя и кодек)
ФОРМАТ АТРИБУТ
ЦВЕТ ЗАГРУЗКИ
ФОНОВЫЙ ЦВЕТ
ТЕКСТ
СБРОС ФОРМАТА АТРИБУТ
С помощью этой информации легко раскрасить строку «Я банан!» с передним цветом "Желтый" и фоновым цветом "Зеленый", как это
Или с библиотекой C ++ colorize
Больше примеров с FORMAT ATTRIBUTE здесь
источник
Это старая тема, но я написал класс с вложенными подклассами и статическими членами для цветов, определяемых простыми макросами Си.
Я получил
color
функцию из этого поста Цветной текст на C Программирование в dreamincode.net от пользователя no2pencil.Я сделал это таким образом, чтобы иметь возможность использовать статические константы в потоке std :: cout следующим образом:
Класс и исходный код тестовой программы можно скачать здесь .
cc::console
сбросит цвета и атрибуты консоли по умолчанию,cc::underline
подчеркнет текст, который работает на шпатлевке, которую я тестировал в тестовой программе.Цвета:
Который может использоваться как
fore
соback
статическими подклассами, так и соcc
статическими классами.РЕДАКТИРОВАТЬ 2017
Я просто добавляю код класса здесь, чтобы быть более практичным.
Макросы цветового кода:
и основная функция цвета, которая определяет цвет или атрибут экрана:
ccolor.h
ccolor.cpp
источник
const char *cc::bold = CC_ATTR(1);
Вы можете использовать escape-последовательности, если ваш терминал поддерживает это. Например:
источник
Расширенная версия заголовка gon1332:
Как вы можете видеть, он имеет больше возможностей, таких как возможность устанавливать цвет фона временно, на неопределенный срок и другие функции. Я также считаю, что это немного более удобно для начинающих и легче запомнить все функции.
Просто включите заголовочный файл в свой проект, и вы готовы к работе с цветным терминалом.
источник
попробуйте мой заголовок здесь для быстрого и простого способа раскрасить текст: Aedi's Color Header
Бегство-Sequence-Color-заголовок
Раскрась свой вывод в Unix, используя C ++ !!
Параметры текстовых атрибутов:
Варианты цвета:
Формат:
Общий формат, включите желаемое значение в $ variable $
например
Использование:
Просто используйте, чтобы передать нужный цвет перед выводом текста, и снова используйте, чтобы установить цвет на нормальный после вывода текста.
источник
Вы можете использовать цветовые коды ANSI.
используйте эти функции.
источник
Лучше всего использовать библиотеку ncurses - хотя это может быть кувалдой, чтобы сломать орех, если вы просто хотите вывести простую цветную строку
источник
в оболочке OSX это работает для меня (включая 2 пробела перед «красным текстом»):
источник