349

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

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

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

4

5 回答 5

864

您正在寻找的 ANSI 转义序列是 Select Graphic Rendition 子集。所有这些都有形式

\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)。

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

字体效果

代码 影响 笔记
0 重置/正常 关闭所有属性
1 粗体或增加强度
2 昏厥(强度降低) 没有得到广泛支持。
3 斜体 没有得到广泛支持。有时被视为逆。
4 强调
5 慢闪 每分钟少于 150
6 快速闪烁 MS-DOS ANSI.SYS; 每分钟 150+;没有得到广泛支持
7 [[反向视频]] 交换前景色和背景色
8 隐藏 没有得到广泛支持。
9 划掉 字符清晰,但标记为删除。没有得到广泛支持。
10 主要(默认)字体
11-19 备用字体 选择备用字体n-10
20 弗拉克图尔 几乎不支持
21 粗体或双下划线 粗体字未得到广泛支持;几乎不支持双下划线。
22 正常颜色或强度 不大胆也不淡漠
23 不是斜体,不是 Fraktur
24 下划线关闭 没有单下划线或双下划线
25 闪烁
27 反向关闭
28 揭示 隐瞒
29 没有划掉
30–37 设置前景色 请参阅下面的颜色表
38 设置前景色 下一个参数是5;<n>or 2;<r>;<g>;<b>,见下文
39 默认前景色 实现定义(根据标准)
40–47 设置背景颜色 请参阅下面的颜色表
48 设置背景颜色 下一个参数是5;<n>or 2;<r>;<g>;<b>,见下文
49 默认背景颜色 实现定义(根据标准)
51 装裱
52 包围
53 上划线
54 没有被框住或包围
55 未上划线
60 表意文字下划线 几乎不支持
61 表意文字双下划线 几乎不支持
62 表意文字上划线 几乎不支持
63 表意文字双上划线 几乎不支持
64 表意文字重音标记 几乎不支持
65 表意文字属性关闭 重置所有60-64的效果
90–97 设置明亮的前景色 aixterm(非标准)
100–107 设置明亮的背景颜色 aixterm(非标准)

2 位颜色

你已经有了这个!

4 位颜色

实现终端颜色的标准始于有限的(4 位)选项。下表列出了各种终端仿真器用于这些的背景和前景色的 RGB 值:

各种终端仿真器实现的 ANSI 颜色表

使用上述方法,您可以使用以下方法在绿色背景上制作红色文本(但为什么?):

\033[31;42m

11 种颜色(插曲)

在他们的“基本颜色术语:它们的普遍性和演变”一书中,布伦特柏林和保罗凯使用从一系列语言家族的二十种不同语言收集的数据来识别十一种可能的基本颜色类别:白色、黑色、红色、绿色、黄色、蓝色、棕色、紫色、粉色、橙色和灰色。

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

  1. 所有语言都包含黑色(冷色)和白色(亮色)的术语。
  2. 如果一种语言包含三个术语,那么它包含一个红色术语。
  3. 如果一种语言包含四个术语,则它包含绿色或黄色(但不是两者)的术语。
  4. 如果一种语言包含五个术语,则它包含绿色和黄色的术语。
  5. 如果一种语言包含六个术语,那么它包含一个蓝色术语。
  6. 如果一种语言包含七个术语,那么它包含一个棕色术语。
  7. 如果一种语言包含八个或更多术语,则它包含紫色、粉红色、橙色或灰色的术语。

这可能就是故事贝奥武夫只包含黑色、白色和红色的原因。这也可能是圣经没有包含蓝色的原因。荷马的奥德赛包含近 200 次黑色和约 100 次白色。红色出现 15 次,而黄色和绿色仅出现 10 次。(更多信息在这里

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

中文与英文的颜色名称。 图片改编自

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

8 位 (256) 色

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

ANSI 转义序列的 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_colours::

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

这打印

简单的 ANSI 颜色

于 2015-10-19T04:49:11.423 回答
19

怎么样:

ECMA-48 - 编码字符集的控制功能,第 5 版(1991 年 6 月) - 定义颜色控制代码的标准,显然也受 xterm 支持。

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

在 ANSI 转义码的 Wikipedia 页面上,此表中有一个 xterm 列

于 2011-01-30T10:43:59.457 回答
11

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

于 2013-12-11T10:39:46.087 回答
5

它与您的终端绝对相关。VTE 不支持眨眼,如果根据 VTE使用gnome-terminal, tilda, guake, terminator,等,则不会出现眨眼。 如果您在 VTE 上使用或想要使用眨眼,则必须使用. 您可以使用带有终端名称的 infocmp 命令:xfce4-terminal
xterm

#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,
于 2016-03-16T20:03:12.110 回答
4

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

于 2019-05-23T14:32:09.100 回答