在大多数终端上,可以使用\033 ANSI转义序列对输出进行着色。

我正在寻找所有支持的颜色和选项的列表(如明亮和闪烁)。

由于支持它们的终端之间可能存在差异,因此我主要对xterm兼容终端支持的序列感兴趣。


如何:

编码字符集的控制函数,第5版(1991年6月) 定义颜色控制代码的标准,显然xterm也支持该标准。

SGR 38和48最初由ECMA-48保留,但几年后在联合ITU、IEC和ISO标准中得到了补充,该标准分为几个部分,并(在许多其他方面)记录了直接颜色和索引颜色的SGR 38/48控制序列:

信息技术。开放文档体系结构(ODA)和交换格式:文档结构T.412。国际电信联盟。 信息技术。开放文档体系结构和交换格式:字符内容体系结构T.416。国际电信联盟。 信息技术。开放文档架构(ODA)和交换格式:字符内容架构ISO / IEC 8613 - 6:1994。国际标准化组织。

在维基百科的ANSI转义码表中有一列xterm


还有一些更有趣的和相关的信息。

http://wiki.bash-hackers.org/scripting/terminalcodes http://www.termsys.demon.co.uk/vtansi.htm(死了;archive.org快照) http://invisible-island.net/xterm/ctlseqs/ctlseqs.html http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/c327.html https://wiki.archlinux.org/index.php/Color_Bash_Prompt


您正在寻找的ANSI转义序列是“选择图形再现”子集。所有这些都有形式

\033[XXXm

其中XXX是一系列以分号分隔的参数。

也就是说,在C语言中将文本设置为红色、粗体和下划线(我们将在下面讨论许多其他选项),你可能会这样写:

printf("\033[31;1;4mHello\033[0m");

在c++中

std::cout<<"\033[31;1;4mHello\033[0m";

在Python3中使用

print("\033[31;1;4mHello\033[0m")

在Bash中使用

echo -e "\033[31;1;4mHello\033[0m"

其中第一部分使文本变成红色(31),粗体(1),下划线(4),最后一部分清除所有这些(0)。

如下表所示,您可以设置大量的文本属性,如粗体、字体、下划线等。

字体效果

Code Effect Note
0 Reset / Normal all attributes off
1 Bold or increased intensity
2 Faint (decreased intensity) Not widely supported.
3 Italic Not widely supported. Sometimes treated as inverse.
4 Underline
5 Slow Blink less than 150 per minute
6 Rapid Blink MS-DOS ANSI.SYS; 150+ per minute; not widely supported
7 [[reverse video]] swap foreground and background colors
8 Conceal Not widely supported.
9 Crossed-out Characters legible, but marked for deletion. Not widely supported.
10 Primary(default) font
11–19 Alternate font Select alternate font n-10
20 Fraktur hardly ever supported
21 Bold off or Double Underline Bold off not widely supported; double underline hardly ever supported.
22 Normal color or intensity Neither bold nor faint
23 Not italic, not Fraktur
24 Underline off Not singly or doubly underlined
25 Blink off
27 Inverse off
28 Reveal conceal off
29 Not crossed out
30–37 Set foreground color See color table below
38 Set foreground color Next arguments are 5;<n> or 2;<r>;<g>;<b>, see below
39 Default foreground color implementation defined (according to standard)
40–47 Set background color See color table below
48 Set background color Next arguments are 5;<n> or 2;<r>;<g>;<b>, see below
49 Default background color implementation defined (according to standard)
51 Framed
52 Encircled
53 Overlined
54 Not framed or encircled
55 Not overlined
60 ideogram underline hardly ever supported
61 ideogram double underline hardly ever supported
62 ideogram overline hardly ever supported
63 ideogram double overline hardly ever supported
64 ideogram stress marking hardly ever supported
65 ideogram attributes off reset the effects of all of 60-64
90–97 Set bright foreground color aixterm (not in standard)
100–107 Set bright background color aixterm (not in standard)

2比特的颜色

你已经有这个了!

4比特的颜色

实现终端颜色的标准从有限的(4位)选项开始。下表列出了各种终端模拟器所使用的背景色和前景色的RGB值:

使用上面的方法,你可以在绿色背景上创建红色文本(但是为什么呢?)

\033[31;42m

11种颜色(插曲)

在他们的书《基本颜色术语:它们的普遍性和演变》中,Brent Berlin和Paul Kay使用从20种不同语言中收集的数据,从一系列语系中确定了11种可能的基本颜色类别:白色、黑色、红色、绿色、黄色、蓝色、棕色、紫色、粉红色、橙色和灰色。

柏林和凯发现,在少于最多11种颜色类别的语言中,颜色遵循特定的进化模式。这种模式如下:

All languages contain terms for black (cool colours) and white (bright colours). If a language contains three terms, then it contains a term for red. If a language contains four terms, then it contains a term for either green or yellow (but not both). If a language contains five terms, then it contains terms for both green and yellow. If a language contains six terms, then it contains a term for blue. If a language contains seven terms, then it contains a term for brown. If a language contains eight or more terms, then it contains terms for purple, pink, orange or gray.

这可能就是为什么故事贝奥武夫只包含黑色、白色和红色。这也可能是为什么《圣经》中没有蓝色。《荷马的奥德赛》中,黑色出现了近200次,白色出现了约100次。红色出现15次,而黄色和绿色只出现10次。(详情请点击此处)

语言之间的差异也很有趣:请注意,英语和汉语使用了大量不同的颜色词。然而,深入研究这些语言会发现,每种语言都以不同的方式使用颜色。(更多信息)

一般来说,人类语言中颜色的命名、使用和分组是令人着迷的。现在,回到节目上。

8位(256)颜色

技术进步了,有了256种预选颜色的表格,如下图所示。

使用上面的这些,你可以做出粉色的文本,如下所示:

\033[38;5;206m     #That is, \033[38;5;<FG COLOR>m

并制作一个清晨蓝色背景使用

\033[48;5;57m      #That is, \033[48;5;<BG COLOR>m

当然,你可以把这些结合起来:

\033[38;5;206;48;5;57m

8位的颜色是这样排列的:

0x00-0x07:  standard colors (same as the 4-bit colours)
0x08-0x0F:  high intensity colors
0x10-0xE7:  6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5)
0xE8-0xFF:  grayscale from black to white in 24 steps

所有的颜色

现在我们生活在未来,完整的RGB频谱可用:

\033[38;2;<r>;<g>;<b>m     #Select RGB foreground color
\033[48;2;<r>;<g>;<b>m     #Select RGB background color

所以你可以把粉红色的文字在棕色的背景使用

\033[38;2;255;82;197;48;2;155;106;0mHello

这里列出了对“真彩色”终端的支持。

以上大部分内容来自维基百科页面“ANSI转义代码”。

一个方便的提醒自己的脚本

因为我经常在试图记住什么颜色是什么,我有一个方便的脚本叫做:~/bin/ ansi_colors:

#!/usr/bin/python

print "\\033[XXm"

for i in range(30,37+1):
    print "\033[%dm%d\t\t\033[%dm%d" % (i,i,i+60,i+60);

print "\033[39m\\033[49m - Reset colour"
print "\\033[2K - Clear Line"
print "\\033[<L>;<C>H OR \\033[<L>;<C>f puts the cursor at line L and column C."
print "\\033[<N>A Move the cursor up N lines"
print "\\033[<N>B Move the cursor down N lines"
print "\\033[<N>C Move the cursor forward N columns"
print "\\033[<N>D Move the cursor backward N columns"
print "\\033[2J Clear the screen, move to (0,0)"
print "\\033[K Erase to end of line"
print "\\033[s Save cursor position"
print "\\033[u Restore cursor position"
print " "
print "\\033[4m  Underline on"
print "\\033[24m Underline off"
print "\\033[1m  Bold on"
print "\\033[21m Bold off"

这个打印


它绝对与你的终端有关。VTE不支持闪烁,如果你根据VTE使用gnome-terminal, tilda, guake, terminator, xfce4-terminal等,你将不会有闪烁。 如果你想在VTE上使用blink,你必须使用xterm。 可以使用终端名infocmp命令:

#infocmp vt100
#infocmp xterm
#infocmp vte

例如:

# infocmp vte
#   Reconstructed via infocmp from file: /usr/share/terminfo/v/vte
vte|VTE aka GNOME Terminal,
    am, bce, mir, msgr, xenl,
    colors#8, cols#80, it#8, lines#24, ncv#16, pairs#64,
    acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
    bel=^G, bold=\E[1m, civis=\E[?25l, clear=\E[H\E[2J,
    cnorm=\E[?25h, cr=^M, csr=\E[%i%p1%d;%p2%dr,
    cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=^J,
    cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
    cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P,
    dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J,
    el=\E[K, enacs=\E)0, home=\E[H, hpa=\E[%i%p1%dG, ht=^I,
    hts=\EH, il=\E[%p1%dL, il1=\E[L, ind=^J, invis=\E[8m,
    is2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8,
    kDC=\E[3;2~, kEND=\E[1;2F, kHOM=\E[1;2H, kIC=\E[2;2~,
    kLFT=\E[1;2D, kNXT=\E[6;2~, kPRV=\E[5;2~, kRIT=\E[1;2C,
    kb2=\E[E, kbs=\177, kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB,
    kcuf1=\EOC, kcuu1=\EOA, kdch1=\E[3~, kend=\EOF, kf1=\EOP,
    kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[1;2P,
    kf14=\E[1;2Q, kf15=\E[1;2R, kf16=\E[1;2S, kf17=\E[15;2~,
    kf18=\E[17;2~, kf19=\E[18;2~, kf2=\EOQ, kf20=\E[19;2~,
    kf21=\E[20;2~, kf22=\E[21;2~, kf23=\E[23;2~,
    kf24=\E[24;2~, kf25=\E[1;5P, kf26=\E[1;5Q, kf27=\E[1;5R,
    kf28=\E[1;5S, kf29=\E[15;5~, kf3=\EOR, kf30=\E[17;5~,
    kf31=\E[18;5~, kf32=\E[19;5~, kf33=\E[20;5~,
    kf34=\E[21;5~, kf35=\E[23;5~, kf36=\E[24;5~,
    kf37=\E[1;6P, kf38=\E[1;6Q, kf39=\E[1;6R, kf4=\EOS,
    kf40=\E[1;6S, kf41=\E[15;6~, kf42=\E[17;6~,
    kf43=\E[18;6~, kf44=\E[19;6~, kf45=\E[20;6~,
    kf46=\E[21;6~, kf47=\E[23;6~, kf48=\E[24;6~,
    kf49=\E[1;3P, kf5=\E[15~, kf50=\E[1;3Q, kf51=\E[1;3R,
    kf52=\E[1;3S, kf53=\E[15;3~, kf54=\E[17;3~,
    kf55=\E[18;3~, kf56=\E[19;3~, kf57=\E[20;3~,
    kf58=\E[21;3~, kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~,
    kf61=\E[1;4P, kf62=\E[1;4Q, kf63=\E[1;4R, kf7=\E[18~,
    kf8=\E[19~, kf9=\E[20~, kfnd=\E[1~, khome=\EOH,
    kich1=\E[2~, kind=\E[1;2B, kmous=\E[M, knp=\E[6~,
    kpp=\E[5~, kri=\E[1;2A, kslt=\E[4~, meml=\El, memu=\Em,
    op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM, ritm=\E[23m,
    rmacs=^O, rmam=\E[?7l, rmcup=\E[2J\E[?47l\E8, rmir=\E[4l,
    rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m, rs1=\Ec,
    rs2=\E7\E[r\E8\E[m\E[?7h\E[!p\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[?25h,
    sc=\E7, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
    sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p5%t;2%;%?%p7%t;8%;%?%p1%p3%|%t;7%;m%?%p9%t\016%e\017%;,
    sgr0=\E[0m\017, sitm=\E[3m, smacs=^N, smam=\E[?7h,
    smcup=\E7\E[?47h, smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m,
    smul=\E[4m, tbc=\E[3g, u6=\E[%i%d;%dR, u7=\E[6n,
    u8=\E[?%[;0123456789]c, u9=\E[c, vpa=\E[%i%p1%dd,

对于那些除了上述语言之外没有得到正确结果的人,如果你使用c#将文本打印到控制台(终端)窗口,你应该将“\033”替换为“\x1b”。在Visual Basic中是Chrw(27)。


下面是一些代码,它显示了所有与颜色有关的转义序列。为了使代码正常工作,您可能需要获得实际的转义字符。

@echo off
:top
cls
echo [101;93m STYLES [0m
echo ^<ESC^>[0m [0mReset[0m
echo ^<ESC^>[1m [1mBold[0m
echo ^<ESC^>[4m [4mUnderline[0m
echo ^<ESC^>[7m [7mInverse[0m
echo.
echo [101;93m NORMAL FOREGROUND COLORS [0m
echo ^<ESC^>[30m [30mBlack[0m (black)
echo ^<ESC^>[31m [31mRed[0m
echo ^<ESC^>[32m [32mGreen[0m
echo ^<ESC^>[33m [33mYellow[0m
echo ^<ESC^>[34m [34mBlue[0m
echo ^<ESC^>[35m [35mMagenta[0m
echo ^<ESC^>[36m [36mCyan[0m
echo ^<ESC^>[37m [37mWhite[0m
echo.
echo [101;93m NORMAL BACKGROUND COLORS [0m
echo ^<ESC^>[40m [40mBlack[0m
echo ^<ESC^>[41m [41mRed[0m
echo ^<ESC^>[42m [42mGreen[0m
echo ^<ESC^>[43m [43mYellow[0m
echo ^<ESC^>[44m [44mBlue[0m
echo ^<ESC^>[45m [45mMagenta[0m
echo ^<ESC^>[46m [46mCyan[0m
echo ^<ESC^>[47m [47mWhite[0m (white)
echo.
echo [101;93m STRONG FOREGROUND COLORS [0m
echo ^<ESC^>[90m [90mWhite[0m
echo ^<ESC^>[91m [91mRed[0m
echo ^<ESC^>[92m [92mGreen[0m
echo ^<ESC^>[93m [93mYellow[0m
echo ^<ESC^>[94m [94mBlue[0m
echo ^<ESC^>[95m [95mMagenta[0m
echo ^<ESC^>[96m [96mCyan[0m
echo ^<ESC^>[97m [97mWhite[0m
echo.
echo [101;93m STRONG BACKGROUND COLORS [0m
echo ^<ESC^>[100m [100mBlack[0m
echo ^<ESC^>[101m [101mRed[0m
echo ^<ESC^>[102m [102mGreen[0m
echo ^<ESC^>[103m [103mYellow[0m
echo ^<ESC^>[104m [104mBlue[0m
echo ^<ESC^>[105m [105mMagenta[0m
echo ^<ESC^>[106m [106mCyan[0m
echo ^<ESC^>[107m [107mWhite[0m
echo.
echo [101;93m COMBINATIONS [0m
echo ^<ESC^>[31m                     [31mred foreground color[0m
echo ^<ESC^>[7m                      [7minverse foreground ^<-^> background[0m
echo ^<ESC^>[7;31m                   [7;31minverse red foreground color[0m
echo ^<ESC^>[7m and nested ^<ESC^>[31m [7mbefore [31mnested[0m
echo ^<ESC^>[31m and nested ^<ESC^>[7m [31mbefore [7mnested[0m
pause > nul
goto top