Làm cách nào để xuất văn bản màu sang thiết bị đầu cuối Linux?


300

Làm cách nào để in các ký tự màu sang thiết bị đầu cuối Linux hỗ trợ nó?

Làm thế nào để tôi biết liệu thiết bị đầu cuối hỗ trợ mã màu?


9
Để xác định thiết bị đầu cuối có khả năng gì, hãy kiểm tra cơ sở dữ liệu khả năng của thiết bị đầu cuối. thấy termcap(5).
jrockway

1
Hãy xem đoạn mã tôi đặt ở đây . Đây là một công cụ nhỏ tô màu đầu ra của nó với sự trợ giúp của một số macro.
epatel

7
"Cơ sở dữ liệu termcap là một cơ sở lỗi thời để mô tả khả năng của các thiết bị đầu cuối tế bào ký tự và máy in. Nó chỉ được giữ lại cho khả năng với các chương trình cũ; những cái mới nên sử dụng terminfo(5)cơ sở dữ liệu và các thư viện liên quan." -termcap(5)
OrangeDog

Bạn có thể dễ dàng tô màu
Rudy Jessop

1
Nếu bạn muốn làm một số công cụ tiên tiến với in màu, tôi đề nghị bạn đọc này bài viết. Tôi thấy nó rất hữu ích
SubMachine

Câu trả lời:


408

Bạn cần xuất mã màu ANSI . Lưu ý rằng không phải tất cả các thiết bị đầu cuối hỗ trợ này; nếu các chuỗi màu không được hỗ trợ, rác sẽ xuất hiện.

Thí dụ:

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

Ở đây, \033là ký tự ESC, ASCII 27. Nó được theo sau [, sau đó là 0 hoặc nhiều số được phân tách bằng nhau ;và cuối cùng là chữ cái m. Các con số mô tả màu sắc và định dạng để chuyển từ điểm đó trở đi.

Các mã cho màu nền trước và sau là:

         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

Ngoài ra, bạn có thể sử dụng:

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

Xem bảng trên Wikipedia để biết các mã khác, ít được hỗ trợ rộng rãi hơn.


Để xác định xem thiết bị đầu cuối của bạn có hỗ trợ các chuỗi màu hay không, hãy đọc giá trị của TERMbiến môi trường. Cần xác định loại thiết bị đầu cuối đặc biệt được sử dụng (ví dụ như vt100, gnome-terminal, xterm, screen, ...). Sau đó tìm kiếm trong cơ sở dữ liệu terminfo ; kiểm tra colorskhả năng.


15
Đây là đầu gối của con ong trên BBS
Vay

11
Làm gì m/ đứng cho?
nipponese

4
@nipponese \033[mđánh dấu điểm bắt đầu và kết thúc của chuỗi thoát cho mã màu ANSI. Tham chiếu: en.wikipedia.org/wiki/ANSI_escape_code#CSI_codes
thameera

20
Tôi sử dụng nó xác định "trình điều khiển", chẳng hạn như const std::string red("\033[0;31m");hoặc const std::string reset("\033[0m");. Sau đó, tôi có thể viết đơn giản cout << red << "red text" << reset << endl;.
Daniel Langr

4
Tôi sẽ xem xét điều này để hình dung về màu sắc: misc.flogisoft.com/bash/tip_colors_and_formatted
Liran Funaro

97

Khái niệm cơ bản

Tôi đã viết một lớp C ++ có thể được sử dụng để đặt màu nền trước và màu nền của đầu ra. Chương trình mẫu này đóng vai trò là một ví dụ về in This ->word<- is red.và định dạng nó sao cho màu nền trước wordlà màu đỏ.

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

Nguồn

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

Nâng cao

Bạn có thể muốn thêm các tính năng bổ sung cho lớp. Chẳng hạn, có thể thêm màu đỏ tươi và thậm chí các kiểu như in đậm . Để làm điều này, chỉ cần một mục khác để Codeliệt kê. Đây là một tài liệu tham khảo tốt.


Tuyệt quá. Nó có thể hữu ích nếu bạn có thể thêm các màu khác và cả màu nền.
nano

7
một số chi tiết khác: `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_ 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
Nếu bạn xác định operator<<cho Code, sau đó bạn có thể viết trực tiếp std::cout << Color::FG_RED;thay vì std::cout << Modifier(Color::FG_RED);. Đó là, Modifiersẽ không cần thiết.
Nawaz

2
@Nawaz Ý kiến ​​hay. Đây là một triển khai như thế: pastebin.com/zWC3t9hC . Tuy nhiên, tôi sẽ giữ nguyên cách thực hiện ban đầu của mình trong câu trả lời vì tôi cảm thấy rằng nó mở rộng hơn.
Joel Sjögren

1
Trên thực tế tôi thích cách triển khai đầu tiên tốt hơn khi bạn có thể thêm cờ để bật hoặc tắt màu: Thêm bool sh;vào lớp và thay đổi hàm tạo thành Modifier (Code pCode, bool show = true) : code(pCode), sh(show) {}. Cuối cùng, trong phần thân của <<toán tử trả về dòng hiện tại if (sh)return << os;nếu không. Điều này cho phép viết mã của bạn với Color::Modifier red(Color::FG_RED, BoolVar);nơi bạn có thể đặt BoolVarlà đúng hoặc sai khi khởi tạo chương trình. Bạn có thể bật nó lên để xem nó trên màn hình và tắt để chuyển hướng đến một tập tin.
rpsml 6/2/2015

42

Trước khi bạn xuất bất kỳ màu nào bạn cần đảm bảo rằng bạn đang ở trong một thiết bị đầu cuối:

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

Sau đó, bạn cần kiểm tra khả năng của thiết bị đầu cuối nếu nó hỗ trợ màu

trên các hệ thống có terminfo (dựa trên Linux), bạn có thể nhận được số lượng màu được hỗ trợ như

Number_Of_colors_Supported=$(tput colors)

trên các hệ thống có termcap (dựa trên BSD), bạn có thể nhận được số lượng màu được hỗ trợ như

Number_Of_colors_Supported=$(tput Co)

Sau đó đưa ra quyết định:

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

BTW, không sử dụng màu như được đề xuất trước đó với các ký tự ESC. Sử dụng cuộc gọi tiêu chuẩn đến khả năng của thiết bị đầu cuối sẽ gán cho bạn các màu ĐÚNG mà thiết bị đầu cuối cụ thể hỗ trợ.

Dựa trên 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)"
Dựa trên 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)"
Sử dụng như là
echo -e "${fg_red}  Red  ${fg_green} Bull ${reset}"

3
Đây không phải là bash cụ thể? -t 1 rõ ràng sẽ không hoạt động trong C ++ và việc gọi chương trình này sẽ khiến nó trở nên rất tròn trịa khi ở trong chương trình C ++.
Macha

2
@Macha, vâng, [ -t 1 ]đó là sh / bash cụ thể, nhưng ở phía bên phải sau khi #(comment)đăng nhập có chức năng C làm tương tự. man 3 isattysẽ giúp về điều này;) Ví dụ được hiển thị dưới dạng các lệnh shell để đơn giản hóa việc giải thích điểm chính. Về phần tputtiện ích nguồn MỞ để truy vấn giao diện khả năng đầu cuối tiêu chuẩn.
Alex

1
Tôi không chắc tại sao mọi người cứ đề nghị sử dụng các mã đó trực tiếp. Đó là thực tế, thực sự thực sự xấu để đưa ra các giả định như vậy. Ngay cả khi đây là mã cụ thể của shell, nó có thể được dịch bởi bất kỳ ai có ngay cả một lượng kinh nghiệm shell mới.
osirisgothra

34

Như những người khác đã nêu, bạn có thể sử dụng các ký tự thoát. Bạn có thể sử dụng tiêu đề của tôi để làm cho nó dễ dàng hơn:

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

Một ví dụ sử dụng macro của tiêu đề có thể là:

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

nhập mô tả hình ảnh ở đây


Tiêu đề tuyệt vời!
Trịnh Qu

16

Tôi sử dụng giải pháp sau đây, nó khá đơn giản và thanh lịch, có thể dễ dàng dán vào nguồn và hoạt động trên 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;

14

Theo hiểu biết của tôi, một mã màu ANSI điển hình

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

bao gồm (tên và codec)

  • GIỚI THIỆU

    { "Default", "0" },
    { "Bold", "1" },
    { "Dim", "2" },
    { "Underlined", "3" },
    { "Blink", "5" },
    { "Reverse", "7" },
    { "Hidden", "8" }
  • MÀU SẮC

    { "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" }
  • MÀU NỀN

    { "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" }
  • BẢN VĂN

  • Đặt lại FORMAT ATTRIBUTE

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

Với thông tin này, thật dễ dàng để tô màu một chuỗi "Tôi là một quả chuối!" với màu nền "Vàng" và màu nền "Xanh" như thế này

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

Hoặc với một thư viện C ++ tô màu

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

Thêm ví dụ với FORMAT ATTRIBUTE tại đâynhập mô tả hình ảnh ở đây


Điều này tốt hơn nhiều và tôi có thể sử dụng nó trong Phần mở rộng PHP C ++ của mình.
Aftab Naveed

12

Đây là một chủ đề cũ, nhưng tôi đã viết một lớp với các lớp con lồng nhau và các thành viên tĩnh cho các màu được xác định bởi các macro C đơn giản.

Tôi đã nhận được colorchức năng từ bài đăng này Văn bản màu trong lập trình C trong dreamincode.net bởi người dùng no2ppson.

Tôi đã làm theo cách này để có thể sử dụng các hằng số tĩnh trong luồng std :: cout như thế này:

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

Lớp và mã nguồn chương trình thử nghiệm có thể được tải xuống ở đây .

cc::consolesẽ đặt lại về màu sắc và thuộc tính mặc định của bàn điều khiển, cc::underlinesẽ gạch chân văn bản, hoạt động trên putty mà tôi đã thử nghiệm chương trình thử nghiệm.

Màu sắc:

black
blue
red
magenta
green
cyan
yellow
white

lightblack
lightblue
lightred
lightmagenta
lightgreen
lightcyan
lightyellow
lightwhite

Mà có thể được sử dụng với cả hai forebackcác lớp con tĩnh của cclớp tĩnh.

EDIT 2017

Tôi chỉ thêm mã lớp ở đây để thực tế hơn.

Các macro mã màu:

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

và chức năng màu chính xác định màu hoặc thuộc tính cho màn hình:

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

2
Cảm ơn mã. Tôi đã thêm một mã thoát ANSI khác để cho phép hiển thị văn bản in đậm:const char *cc::bold = CC_ATTR(1);
Drew Noakes

Cảm ơn đã bổ sung. Tôi đã bao gồm điều này cho mã lớp.
Christos Lytras

9

Bạn có thể sử dụng các chuỗi thoát, nếu thiết bị đầu cuối của bạn hỗ trợ nó. Ví dụ:

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

9

Một phiên bản mở rộng của tiêu đề gon1332:

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

Như bạn có thể thấy, nó có nhiều khả năng hơn như khả năng thiết lập màu nền tạm thời, vô thời hạn và các tính năng khác. Tôi cũng tin rằng nó thân thiện với người mới bắt đầu hơn một chút và dễ nhớ tất cả các chức năng.

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

Chỉ cần bao gồm tệp tiêu đề trong dự án của bạn và bạn đã sẵn sàng khuấy động với đầu ra thiết bị đầu cuối màu.


3

hãy thử tiêu đề của tôi ở đây để biết cách nhanh chóng và dễ dàng để tô màu văn bản: Tiêu đề màu của Aedi's


Escape-Sequence-Color-Header

Tô màu Đầu ra của bạn trong Unix bằng C ++ !!


Tùy chọn thuộc tính văn bản:

ATTRIBUTES_OFF, BOLD, UNDERSCORE, BLINK, REVERSE_VIDEO, CONCEALED


Tùy chọn màu:

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


Định dạng:

Định dạng chung, bao gồm giá trị bạn muốn trong $ biến $

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

ví dụ

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


Sử dụng:

Chỉ cần sử dụng để truyền phát màu bạn muốn trước khi xuất văn bản và sử dụng lại để đặt màu thành bình thường sau khi xuất văn bản.

cout << COLOR_BLUE_BLACK << "TEXT" << COLOR_NORMAL << endl;
cout << COLOR_BOLD_YELLOW_CYAN << "TEXT" << COLOR_NORMAL << endl;

Đây là một câu trả lời chỉ liên kết và sẽ vô dụng nếu liên kết không hoạt động. Vui lòng thêm một số mã hoặc giải thích câu trả lời của bạn
dgilperez

2
Xin lỗi, người mới ở đây ... Chỉ cần thêm một số thông tin. Liều lượng công việc này?
Uduse 10/2/2015

@ sjm324 Tôi đoán liệu BLINK có được hỗ trợ hay không dựa trên hệ thống của bạn
Uduse 6/2/2016

3

Bạn có thể sử dụng mã màu ANSI.

sử dụng các chức năng này.

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

2

Cách tốt nhất là sử dụng thư viện ncurses - mặc dù đây có thể là búa tạ để bẻ đai ốc nếu bạn chỉ muốn xuất ra một chuỗi màu đơn giản


3
@Nick sẽ là một nỗi đau khi sử dụng ncurses để chỉ đạt được một số màu thông qua tiếng vang. :)
người mang nhẫn

2

trên shell OSX, cái này hoạt động với tôi (bao gồm 2 khoảng trắng phía trước "văn bản màu đỏ"):

$ printf "\e[033;31m  red text\n"
$ echo "$(tput setaf 1)  red text"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.