Bagaimana cara menampilkan teks berwarna ke terminal Linux?

300

Bagaimana cara mencetak karakter berwarna ke terminal Linux yang mendukungnya?

Bagaimana saya tahu apakah terminal mendukung kode warna?

Macha
sumber
9
Untuk menentukan kemampuan terminal, periksa basis data kemampuan terminal. lihat termcap(5).
jrockway
1
Jangan ragu untuk melihat potongan kode yang saya taruh di sini . Ini adalah alat kecil yang mewarnai hasilnya dengan bantuan beberapa makro.
epatel
7
"Database termcap adalah fasilitas usang untuk menggambarkan kemampuan terminal sel-karakter dan printer. Itu dipertahankan hanya untuk kemampuan dengan program-program lama; yang baru harus menggunakan terminfo(5)database dan perpustakaan terkait." -termcap(5)
OrangeDog
Anda dapat dengan mudah menggunakan termcolor
Rudy Jessop
1
Jika Anda ingin melakukan beberapa hal lanjut dengan pencetakan warna, saya sarankan Anda membaca artikel ini . Saya merasa sangat membantu
SubMachine

Jawaban:

408

Anda perlu menampilkan kode warna ANSI . Perhatikan bahwa tidak semua terminal mendukung ini; jika urutan warna tidak didukung, sampah akan muncul.

Contoh:

 cout << "\033[1;31mbold red text\033[0m\n";

Di sini, \033adalah karakter ESC, ASCII 27. Diikuti oleh [, kemudian nol atau lebih angka yang dipisahkan oleh ;, dan akhirnya huruf m. Angka-angka menggambarkan warna dan format untuk beralih dari titik itu dan seterusnya.

Kode untuk warna foreground dan background adalah:

         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

Selain itu, Anda dapat menggunakan ini:

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

Lihat tabel di Wikipedia untuk kode lain yang kurang didukung secara luas.


Untuk menentukan apakah terminal Anda mendukung urutan warna, baca nilai TERMvariabel lingkungan. Ini harus menentukan jenis terminal tertentu yang digunakan (misalnya vt100, gnome-terminal, xterm, screen, ...). Kemudian lihat di database terminfo ; periksa colorskapabilitas.

Thomas
sumber
15
Ini adalah lutut lebah di BBS ...
Potatoswatter
11
Apa artinya m/ berdiri untuk?
nipponese
4
@nipponese \033[dan mtandai awal dan akhir urutan pelarian untuk kode warna ANSI. Ref: en.wikipedia.org/wiki/ANSI_escape_code#CSI_codes
thameera
20
Saya menggunakannya untuk mendefinisikan "manipulator", seperti const std::string red("\033[0;31m");atau const std::string reset("\033[0m");. Lalu, saya bisa menulis sederhana cout << red << "red text" << reset << endl;.
Daniel Langr
4
Saya akan melihat ini untuk visualisasi warna: misc.flogisoft.com/bash/tip_colors_and_formatting
Liran Funaro
97

Dasar-dasar

Saya telah menulis kelas C ++ yang dapat digunakan untuk mengatur warna foreground dan background dari output. Program sampel ini berfungsi sebagai contoh mencetak This ->word<- is red.dan memformatnya sehingga warna latar depan wordmerah.

#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;
}

Sumber

#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";
        }
    };
}

Maju

Anda mungkin ingin menambahkan fitur tambahan ke kelas. Sebagai contoh, dimungkinkan untuk menambahkan warna magenta dan bahkan gaya seperti huruf tebal . Untuk melakukan ini, hanya entri lain ke Codeenumerasi. Ini referensi yang bagus.

Joel Sjögren
sumber
Bagus. Akan sangat membantu jika Anda dapat menambahkan warna lain dan juga warna latar belakang.
nano
7
beberapa lagi: `FG_DEFAULT = 39, FG_BLACK = 30, FG_RED = 31, FG_GREEN = 32, FG_YELLOW = 33, FG_BLUE = 34, FG_MAGENTA = 35, FG_CYAN = 36, FG_LIGHT_GRAY = 37, FG_LIGHT_GRAY = 37, FG_IGHT _GRAY = GAMBAR, FIGHT_GRIGHT _ GAMBAR 92, FG_LIGHT_YELLOW = 93, FG_LIGHT_BLUE = 94, FG_LIGHT_MAGENTA = 95, FG_LIGHT_CYAN = 96, FG_WHITE = 97, BG_RED = 41, BG_GREEN = 42, BG_BLUE = 44, BG_DEFAULT = 49`
Phantrast
6
Jika Anda menentukan operator<<untuk Code, maka Anda langsung dapat menulis std::cout << Color::FG_RED;bukan std::cout << Modifier(Color::FG_RED);. Itu Modifiertidak dibutuhkan.
Nawaz
2
@Nawaz Ide bagus. Berikut ini adalah implementasi seperti itu: pastebin.com/zWC3t9hC . Namun saya akan tetap menerapkan yang asli dalam jawaban karena saya merasa itu lebih dapat diperluas.
Joel Sjögren
1
Sebenarnya saya lebih suka implementasi pertama karena Anda dapat menambahkan bendera untuk menghidupkan atau mematikan warna: Tambahkan bool sh;ke kelas dan ubah konstruktor menjadi Modifier (Code pCode, bool show = true) : code(pCode), sh(show) {}. Akhirnya, di tubuh <<operator mengembalikan garis saat ini if (sh)dan return << os;sebaliknya. Ini memungkinkan Anda menulis kode dengan Color::Modifier red(Color::FG_RED, BoolVar);mana Anda dapat menetapkan BoolVartrue atau false sebagai inisialisasi program. Anda dapat menyalakannya untuk melihatnya di layar dan mematikan untuk mengarahkan ulang ke file.
rpsml
42

Sebelum Anda menampilkan warna apa pun yang Anda butuhkan, pastikan Anda berada di terminal:

[ -t 1 ] && echo 'Yes I am in a terminal'  # isatty(3) call in C

Maka Anda perlu memeriksa kapabilitas terminal jika mendukung warna

pada sistem dengan terminfo (berbasis Linux) Anda dapat memperoleh jumlah warna yang didukung sebagai

Number_Of_colors_Supported=$(tput colors)

pada sistem dengan termcap (berbasis BSD) Anda dapat memperoleh jumlah warna yang didukung sebagai

Number_Of_colors_Supported=$(tput Co)

Lalu buat keputusan:

[ ${Number_Of_colors_Supported} -ge 8 ] && {
    echo 'You are fine and can print colors'
} || {
    echo 'Terminal does not support color'
}

BTW, jangan gunakan pewarnaan seperti yang disarankan sebelumnya dengan karakter ESC. Gunakan panggilan standar ke kemampuan terminal yang akan memberi Anda warna BENAR yang didukung terminal tertentu.

Berbasis 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)"
Berbasis Linux
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)"
Digunakan sebagai
echo -e "${fg_red}  Red  ${fg_green} Bull ${reset}"
Alex
sumber
3
Bukankah ini spesifik bash? -t 1 jelas tidak akan bekerja di C ++, dan memanggil program tput ini akan membuatnya sangat bundar ketika berada dalam program C ++.
Macha
2
@ Macha, ya, [ -t 1 ]ini spesifik sh / bash, tetapi di sisi kanan setelah #(comment)tanda ada fungsi C yang melakukan hal yang sama. man 3 isattyharus membantu dalam hal ini;) Contoh yang ditampilkan sebagai perintah shell untuk menyederhanakan penjelasan tentang poin utama. Mengenai tpututilitas sumber OPEN itu untuk menanyakan antarmuka kemampuan terminal standar.
Alex
1
Saya tidak yakin mengapa orang terus menyarankan untuk menggunakan kode-kode itu secara langsung. Ini benar-benar, praktik yang sangat buruk untuk membuat asumsi seperti itu. Bahkan jika ini adalah kode khusus shell, ini dapat diterjemahkan oleh siapa pun yang memiliki pengalaman shell baru sekalipun.
osirisgothra
34

Seperti yang dinyatakan orang lain, Anda dapat menggunakan karakter melarikan diri. Anda dapat menggunakan header saya untuk membuatnya lebih mudah:

#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_ */

Contoh menggunakan makro header bisa:

#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;
}

masukkan deskripsi gambar di sini

gon1332
sumber
Header yang luar biasa!
Zheng Qu
16

Saya menggunakan solusi berikut, ini cukup sederhana dan elegan, dapat dengan mudah ditempelkan ke sumber, dan bekerja di Linux / Bash:

const std::string red("\033[0;31m");
const std::string green("\033[1;32m");
const std::string yellow("\033[1;33m");
const std::string cyan("\033[0;36m");
const std::string magenta("\033[0;35m");
const std::string reset("\033[0m");

std::cout << "Measured runtime: " << yellow << timer.count() << reset << std::endl;
Daniel Langr
sumber
14

Dari pemahaman saya, kode warna ANSI khas

"\033[{FORMAT_ATTRIBUTE};{FORGROUND_COLOR};{BACKGROUND_COLOR}m{TEXT}\033[{RESET_FORMATE_ATTRIBUTE}m"

terdiri dari (nama dan codec)

  • ATTRIBUT FORMAT

    { "Default", "0" },
    { "Bold", "1" },
    { "Dim", "2" },
    { "Underlined", "3" },
    { "Blink", "5" },
    { "Reverse", "7" },
    { "Hidden", "8" }
  • FORGROUND COLOR

    { "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" }
  • WARNA LATAR BELAKANG

    { "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" }
  • TEKS

  • ATTRIBUT FORMAT RESET

    { "All", "0" },
    { "Bold", "21" },
    { "Dim", "22" },
    { "Underlined", "24" },
    { "Blink", "25" },
    { "Reverse", "27" },
    { "Hidden", "28" }

Dengan informasi ini, mudah untuk memberi warna pada string "Saya seorang pisang!" dengan warna forground "Kuning" dan warna latar belakang "Hijau" seperti ini

"\033[0;33;42mI am a Banana!\033[0m"

Atau dengan pustaka C ++ berwarna

auto const& colorized_text = color::rize( "I am a banana!", "Yellow", "Green" );
std::cout << colorized_text << std::endl;

Lebih banyak contoh dengan FORMAT ATTRIBUTE di sinimasukkan deskripsi gambar di sini

Feng Wang
sumber
Ini jauh lebih baik dan saya dapat menggunakannya di PHP C ++ Extension saya.
Aftab Naveed
12

Ini adalah topik lama, tapi saya menulis kelas dengan subclass bersarang dan anggota statis untuk warna yang ditentukan oleh makro C sederhana.

Saya mendapatkan colorfungsi dari posting ini Color Text In C Programming di dreamincode.net oleh pengguna no2pencil.

Saya membuatnya dengan cara ini agar dapat menggunakan konstanta statis di std :: cout stream seperti ini:

cout << zkr::cc::fore::red << "This is red text. " 
     << zkr::cc::console << "And changing to console default colors, fg, bg."
     << endl;

Kelas dan kode sumber program pengujian dapat diunduh di sini .

cc::consoleakan mengatur ulang ke konsol warna dan atribut default, cc::underlineakan menggarisbawahi teks, yang berfungsi pada dempul yang telah saya uji program pengujian.

Warna:

black
blue
red
magenta
green
cyan
yellow
white

lightblack
lightblue
lightred
lightmagenta
lightgreen
lightcyan
lightyellow
lightwhite

Yang dapat digunakan dengan kedua foredan backsubclass statis dari cckelas statis.

EDIT 2017

Saya hanya menambahkan kode kelas di sini agar lebih praktis.

Makro kode warna:

#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"

dan fungsi warna utama yang menentukan warna atau atribut ke layar:

char *cc::color(int attr, int fg, int bg)
{
    static char 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:
            static const char *black;
            static const char *blue;
            static const char *red;
            static const char *magenta;
            static const char *green;
            static const char *cyan;
            static const char *yellow;
            static const char *white;
            static const char *console;

            static const char *lightblack;
            static const char *lightblue;
            static const char *lightred;
            static const char *lightmagenta;
            static const char *lightgreen;
            static const char *lightcyan;
            static const char *lightyellow;
            static const char *lightwhite;
        };

        class back
        {
        public:
            static const char *black;
            static const char *blue;
            static const char *red;
            static const char *magenta;
            static const char *green;
            static const char *cyan;
            static const char *yellow;
            static const char *white;
            static const char *console;

            static const char *lightblack;
            static const char *lightblue;
            static const char *lightred;
            static const char *lightmagenta;
            static const char *lightgreen;
            static const char *lightcyan;
            static const char *lightyellow;
            static const char *lightwhite;
        };

        static char *color(int attr, int fg, int bg);
        static const char *console;
        static const char *underline;
        static const char *bold;
    };
}

ccolor.cpp

#include "ccolor.h"

using namespace std;

namespace zkr
{
    enum Color
    {
        Black,
        Red,
        Green,
        Yellow,
        Blue,
        Magenta,
        Cyan,
        White,
        Default = 9
    };

    enum Attributes
    {
        Reset,
        Bright,
        Dim,
        Underline,
        Blink,
        Reverse,
        Hidden
    };

    char *cc::color(int attr, int fg, int bg)
    {
        static char command[13];
        /* Command is the control command to the terminal */
        sprintf(command, "%c[%d;%d;%dm", 0x1B, attr, fg + 30, bg + 40);
        return command;
    }

    const char *cc::console = CC_CONSOLE_COLOR_DEFAULT;
    const char *cc::underline = CC_ATTR(4);
    const char *cc::bold = CC_ATTR(1);

    const char *cc::fore::black = CC_FORECOLOR(30);
    const char *cc::fore::blue = CC_FORECOLOR(34);
    const char *cc::fore::red = CC_FORECOLOR(31);
    const char *cc::fore::magenta = CC_FORECOLOR(35);
    const char *cc::fore::green = CC_FORECOLOR(92);
    const char *cc::fore::cyan = CC_FORECOLOR(36);
    const char *cc::fore::yellow = CC_FORECOLOR(33);
    const char *cc::fore::white = CC_FORECOLOR(37);
    const char *cc::fore::console = CC_FORECOLOR(39);

    const char *cc::fore::lightblack = CC_FORECOLOR(90);
    const char *cc::fore::lightblue = CC_FORECOLOR(94);
    const char *cc::fore::lightred = CC_FORECOLOR(91);
    const char *cc::fore::lightmagenta = CC_FORECOLOR(95);
    const char *cc::fore::lightgreen = CC_FORECOLOR(92);
    const char *cc::fore::lightcyan = CC_FORECOLOR(96);
    const char *cc::fore::lightyellow = CC_FORECOLOR(93);
    const char *cc::fore::lightwhite = CC_FORECOLOR(97);

    const char *cc::back::black = CC_BACKCOLOR(40);
    const char *cc::back::blue = CC_BACKCOLOR(44);
    const char *cc::back::red = CC_BACKCOLOR(41);
    const char *cc::back::magenta = CC_BACKCOLOR(45);
    const char *cc::back::green = CC_BACKCOLOR(42);
    const char *cc::back::cyan = CC_BACKCOLOR(46);
    const char *cc::back::yellow = CC_BACKCOLOR(43);
    const char *cc::back::white = CC_BACKCOLOR(47);
    const char *cc::back::console = CC_BACKCOLOR(49);

    const char *cc::back::lightblack = CC_BACKCOLOR(100);
    const char *cc::back::lightblue = CC_BACKCOLOR(104);
    const char *cc::back::lightred = CC_BACKCOLOR(101);
    const char *cc::back::lightmagenta = CC_BACKCOLOR(105);
    const char *cc::back::lightgreen = CC_BACKCOLOR(102);
    const char *cc::back::lightcyan = CC_BACKCOLOR(106);
    const char *cc::back::lightyellow = CC_BACKCOLOR(103);
    const char *cc::back::lightwhite = CC_BACKCOLOR(107);
}
Christos Lytras
sumber
2
Terima kasih untuk kodenya. Saya menambahkan kode pelarian ANSI lain untuk memungkinkan menampilkan teks tebal:const char *cc::bold = CC_ATTR(1);
Drew Noakes
Terima kasih untuk tambahannya. Saya telah memasukkan ini ke kode kelas.
Christos Lytras
9

Anda dapat menggunakan urutan pelarian, jika terminal Anda mendukungnya. Sebagai contoh:

echo \[\033[32m\]Hello, \[\033[36m\]colourful \[\033[33mworld!\033[0m\]
Vlad
sumber
9

Versi header gon1332 yang diperluas:

//
//  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.
#define BackBLK(x) BACKBLK x RESETTEXT
#define BackRED(x) BACKRED x RESETTEXT
#define BackGRN(x) BACKGRN x RESETTEXT
#define BackYEL(x) BACKYEL x RESETTEXT
#define BackBLU(x) BACKBLU x RESETTEXT
#define BackMAG(x) BACKMAG x RESETTEXT
#define BackCYN(x) BACKCYN x RESETTEXT
#define BackWHT(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.
#define SetBackBLK BACKBLK
#define SetBackRED BACKRED
#define SetBackGRN BACKGRN
#define SetBackYEL BACKYEL
#define SetBackBLU BACKBLU
#define SetBackMAG BACKMAG
#define SetBackCYN BACKCYN
#define SetBackWHT 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)
#define SetForeBLK FOREBLK
#define SetForeRED FORERED
#define SetForeGRN FOREGRN
#define SetForeYEL FOREYEL
#define SetForeBLU FOREBLU
#define SetForeMAG FOREMAG
#define SetForeCYN FORECYN
#define SetForeWHT 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.

#define SetBOLD "\x1B[1m" // Embolden text indefinitely.
#define SetBRIGHT "\x1B[1m" // Brighten text indefinitely. (Same as bold but is available for program clarity)
#define SetUNDL "\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 */

Seperti yang Anda lihat, ia memiliki lebih banyak kemampuan seperti kemampuan untuk mengatur warna latar belakang sementara, tanpa batas waktu, dan fitur lainnya. Saya juga percaya ini sedikit lebih ramah pemula dan lebih mudah mengingat semua fungsi.

#include <iostream>
#include "COLORS.h"

int main() {
  std::cout << SetBackBLU << SetForeRED << endl;
  std::cout << "I am red text on a blue background! :) " << endl;
  return 0;
}

Cukup sertakan file header di proyek Anda dan Anda siap untuk bergoyang-goyang dengan output terminal berwarna.

Nuansa
sumber
3

coba tajuk di sini untuk cara cepat dan mudah mewarnai teks: Header Warna Aedi


Escape-Sequence-Color-Header

Warnai Output Anda di Unix menggunakan C ++ !!


Opsi Atribut Teks:

ATTRIBUTES_OFF, BOLD, UNDERSCORE, BLINK, REVERSE_VIDEO, CONCEALED


Pilihan Warna:

BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE


Format:

Format Umum, termasuk nilai yang Anda inginkan dalam $ variabel $

COLOR_$Foreground_Color$_$Background_Color$
COLOR_$Text_Attribute$_$Foreground_Color$_$Background_Color$
COLOR_NORMAL  // To set color to default

misalnya

COLOR_BLUE_BLACK // Leave Text Attribute Blank if no Text Attribute appied
COLOR_UNDERSCORE_YELLOW_RED
COLOR_NORMAL


Pemakaian:

Cukup gunakan untuk mengalirkan warna yang Anda inginkan sebelum menghasilkan teks dan gunakan lagi untuk mengatur warna ke normal setelah menghasilkan teks.

cout << COLOR_BLUE_BLACK << "TEXT" << COLOR_NORMAL << endl;
cout << COLOR_BOLD_YELLOW_CYAN << "TEXT" << COLOR_NORMAL << endl;
Uduse
sumber
Ini adalah jawaban tautan saja dan akan menjadikan tidak berguna jika tautan turun. Silakan tambahkan beberapa kode atau
uraikan
2
Maaf, pemula di sini ... Baru saja menambahkan beberapa info. Dosis pekerjaan ini?
Uduse
@ sjm324 Saya kira apakah BLINK didukung berdasarkan sistem Anda
Uduse
3

Anda dapat menggunakan kode warna ANSI.

gunakan fungsi-fungsi ini.

enum c_color{BLACK=30,RED=31,GREEN=32,YELLOW=33,BLUE=34,MAGENTA=35,CYAN=36,WHITE=37};
enum c_decoration{NORMAL=0,BOLD=1,FAINT=2,ITALIC=3,UNDERLINE=4,RIVERCED=26,FRAMED=51};
void pr(const string str,c_color color,c_decoration decoration=c_decoration::NORMAL){
  cout<<"\033["<<decoration<<";"<<color<<"m"<<str<<"\033[0m";
}

void prl(const string str,c_color color,c_decoration decoration=c_decoration::NORMAL){
   cout<<"\033["<<decoration<<";"<<color<<"m"<<str<<"\033[0m"<<endl;
}
Shanaka Rusith
sumber
2

Cara terbaik adalah dengan menggunakan perpustakaan ncurses - meskipun ini mungkin palu untuk memecahkan masalah jika Anda hanya ingin menghasilkan string berwarna sederhana

Nick
sumber
3
@Nick itu akan menyakitkan untuk menggunakan ncurses hanya mencapai beberapa pewarnaan melalui gema. :)
pembawa cincin
2

pada OSX shell, ini berfungsi untuk saya (termasuk 2 spasi di depan "teks merah"):

$ printf "\e[033;31m  red text\n"
$ echo "$(tput setaf 1)  red text"
BananaAcid
sumber