ANSI颜色转义序列列表

482

在大多数终端中,可以使用 \033 ANSI 转义序列来给输出内容上色。

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

由于不同支持它们的终端之间可能存在差异,因此我主要关注 xterm 兼容终端支持的序列。

9个回答

1250
你要找的是 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)。

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

字体效果

2位色彩

你已经掌握了这个!

4位色彩

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

Table of ANSI colours implemented by various terminal emulators


\033[31;42m

11种颜色(插曲)

在他们的书籍《基本颜色术语:它们的普遍性和演变》中,布伦特·柏林和保罗·凯利用从二十种不同语言中收集的数据,来确定了十一种可能的基本颜色类别:白色、黑色、红色、绿色、黄色、蓝色、棕色、紫色、粉红色、橙色和灰色。

柏林和凯发现,在拥有少于最大十一种颜色类别的语言中,颜色遵循着特定的演化模式。这个模式如下:

  1. 所有语言都包含黑色(冷色调)和白色(明亮色调)的词汇。
  2. 如果一个语言包含三个词汇,则它包含一个红色的词汇。
  3. 如果一个语言包含四个词汇,则它包含一个绿色或黄色的词汇(但不同时包含两者)。
  4. 如果一个语言包含五个词汇,则它同时包含绿色和黄色的词汇。
  5. 如果一个语言包含六个词汇,则它包含一个蓝色的词汇。
  6. 如果一个语言包含七个词汇,则它包含一个棕色的词汇。
  7. 如果一个语言包含八个或更多词汇,则它同时包含紫色、粉红色、橙色或灰色的词汇。
更多信息请点击此处
更多信息

Chinese vs English colour names. Image adapted from "muyueh.com"



256-bit colour mode for ANSI escape sequences


\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


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/env python3

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 color")
print("\\033[2K                          - Clear Line")
print("\\033[<L>;<C>H or \\033[<L>;<C>f  - Put 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\n")
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\n")
print("\\033[4m                          - Underline on")
print("\\033[24m                         - Underline off\n")
print("\\033[1m                          - Bold on")
print("\\033[21m                         - Bold off")

这打印

Simple ANSI colours

代码 效果 备注
0 重置/正常 关闭所有属性
1 加粗或增加强度
2 淡化(降低强度) 支持程度有限。
3 斜体 支持程度有限。有时被视为反色。
4 下划线
5 慢闪烁 每分钟不超过150次
6 快闪烁 MS-DOS ANSI.SYS;每分钟150次以上;支持程度有限
7 [[反显]] 交换前景色和背景色
8 隐藏 支持程度有限。
9 删除线 字符可读,但标记为删除。支持程度有限。
10 主要(默认)字体
11–19 备用字体 选择备用字体n-10
20 Fraktur字体 几乎不被支持
21 关闭加粗或双下划线 关闭加粗的支持程度有限;双下划线几乎不被支持。
22 正常颜色或强度 既不加粗也不淡化
23 非斜体,非Fraktur字体
24 关闭下划线 没有单下划线或双下划线
25 关闭闪烁
27 关闭反显
28 显示隐藏内容 关闭隐藏
29 取消删除线
30–37 设置前景色 参见下面的颜色表
38 设置前景色 下一个参数是5;<n>2;<r>;<g>;<b>,参见下面
39 默认前景色 根据标准定义(实现定义)
40–47 设置背景色 参见下面的颜色表
48 设置背景色 下一个参数是5;<n>2;<r>;<g>;<b>,参见下面
使用上述方法,您可以在绿色背景上制作红色文本(但为什么要这样做呢?),方法如下: 这可能是为什么故事《贝奥武夫》只包含黑色、白色和红色。这也可能是为什么《圣经》不包含蓝色。荷马的《奥德赛》中黑色出现了近200次,白色约100次。红色出现了15次,而黄色和绿色只出现了10次。()语言之间的差异也很有趣:注意英语与中文使用不同的颜色词汇的丰富程度。然而,深入研究这些语言会发现它们各自以不同的方式使用颜色。() 总的来说,人类语言中颜色的命名、使用和分组是非常迷人的。现在,回到节目。8位(256)色彩随着技术的进步,256种预选颜色的表格也变得可用,如下所示。 使用上述方法,您可以制作粉色的文本,就像这样:制作一个清晨的蓝色背景。当然,你可以将它们结合起来使用。8位色彩的排列方式如下:所以你可以使用粉红色的文字放在棕色的背景上。

5
@giusti: 对我来说,echo -e "\033[38;05;34;1mHi"echo -e "\033[38;05;34m\033[1mHi" 都能正常使用,但是在我测试的终端中,反锯齿字体效果会导致粗体下颜色略有变化。 - Richard
5
SGR(\033[)代码以38和48开头,应该使用否则保留的:作为子分隔符进行分隔,尽管这在主要来源(http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf和https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-T.416-199303-I!!PDF-E&type=items)中并不完全清楚。另外,一些解释在`2`(16M-彩色RGB)/`3`(16M-彩色CMY)/`4`(??? CMYK)形式中忘记了颜色空间Id - 例如,白色16M前景色应为\033[38:2::255:255:255m而不是\033[38:2:255:255:255m - SlySven
3
我之所以会提到这个问题,是因为我正在为一个名为Mudlet的项目编写代码,它需要处理这两种形式。最近我花了很多时间来改进它的功能。 - SlySven
21
我只是想找一个ANSI颜色列表,结果花了太多时间看“基本颜色术语”的文章。感谢这个好的分心! :) - mzuther
3
很好的事实核查,@GregH。Tekhelet是一种蓝色染料(也是“蓝色”的希伯来语单词),在希伯来圣经中被引用了49次。另请参见犹太教中的蓝色 - Adam Katz
显示剩余20条评论

24

如何看待:

ECMA-48 - 编码字符集控制功能,第五版(1991年6月) - 这是一个标准,定义了颜色控制代码,并且显然也被xterm支持。

SGR 38和48最初由ECMA-48保留,但在几年后,它们在ITU、IEC和ISO的合作下得到了充实,在多个部分中记录了直接颜色索引颜色的SGR 38/48控制序列,其中还有许多其他内容:

在维基百科上的ANSI转义码页面上,有一个适用于xterm的表格


ECMA-48标准并未定义ESC[38..颜色控制码。 - stevea

20
当你写一个 ANSI 转义码 \033[<color>m 时,将 <color> 替换为下面的任何颜色代码。例如,\033[31m 将是红色文本颜色:
颜色 示例 文本 背景 亮文本 亮背景
黑色 黑色 30 40 90 100
红色 红色 31 41 91 101
绿色 绿色 32 42 92 102
黄色 黄色 33 43 93 103
蓝色 蓝色 34 44 94 104
洋红 洋红 35 45 95 105
青色 青色 36 46 96 106
白色 白色 37 47 97 107
默认 39 49 99 109
此外,记得每次想要恢复默认终端文本样式时使用\033[0m。否则,任何颜色或样式可能会溢出并影响其他终端消息。
对于效果,代码如下:
效果 开启 关闭 示例
加粗 1 21
变暗 2 22
下划线 4 24
闪烁 5 25
反转 7 27
隐藏 8 28
我推荐阅读以下文章以进一步探索: PS:完全公开透明,我是Colorist软件包的作者。Colorist是一个轻量级工具,可以在许多终端中轻松打印彩色文本。只需使用pip install colorist安装该软件包,然后输入以下命令即可:
from colorist import Color

print(f"Only {Color.CYAN}this part{Color.OFF} is in colour")

Only this part is in colour

此外,Colorist 还支持以 RGB、HSL 或十六进制定义的颜色,如果您的终端支持高级 ANSI 颜色的话。
from colorist import ColorRGB, BgColorRGB

dusty_pink = ColorRGB(194, 145, 164)
bg_steel_blue = BgColorRGB(70, 130, 180)

print(f"I want to use {dusty_pink}dusty pink{dusty_pink.OFF} and {bg_steel_blue}steel blue{bg_steel_blue.OFF} colors inside this paragraph")

Examples of RGB color in terminal

from colorist import ColorHSL, BgColorHSL

mustard_green = ColorHSL(60, 56, 43)
bg_steel_gray = BgColorHSL(190, 2, 49)

print(f"I want to use {mustard_green}mustard green{mustard_green.OFF} and {bg_steel_gray}steel blue{bg_steel_gray.OFF} colors inside this paragraph")

Examples of HSL color in terminal

from colorist import ColorHex, BgColorHex

watermelon_red = ColorHex("#ff5733")
bg_mint_green = BgColorHex("#99ff99")

print(f"I want to use {watermelon_red}watermelon pink{watermelon_red.OFF} and {bg_mint_green}mint green{bg_mint_green.OFF} colors inside this paragraph")

Examples of Hex color in terminal

更多与调色师的选择:

Foreground colors

Background colors

Effects


13

嗯,我编辑了一下修复一个死链,但是我忘记在那时候没有登录,稍微弄乱了格式(我试图保留旧链接但将其划掉)-不幸的是,即使我现在已经登录,我也无法获取编辑以进行修订... 8-P - SlySven
3
谢谢编辑,我已经修正了。可悲的是,链接会失效,像这样基于链接的答案注定会腐烂。我不会再创建这样的答案了——但还是保留这个,因为它仍然大部分按预期工作。 :-) - Palec

6

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


在Java中:(char) 27"\u001b" - Jesse Glick
2
在Java中,\033或者\33可以正常工作,就像许多其他编程语言一样。 - Holger

5

这与你的终端完全相关。VTE不支持闪烁,如果你使用gnome-terminaltildaguaketerminatorxfce4-terminal等基于VTE的终端,就不会出现闪烁。
如果你想在VTE上使用闪烁,你需要使用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,

VTE 0.52 / gnome-terminal 3.28 增加了对闪烁文本的支持(因此它也将在其他基于 VTE 的仿真器中工作)。 - egmont

2

这里有一些与颜色相关的转义序列代码。您可能需要获取实际的转义字符才能使代码正常工作。

@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

这是一个 Telnet 脚本还是其他什么? - n_moen
1
@arcanemachine 这是批处理(Windows脚本语言)。 - undefined

0

PowerShell

关于更完整的(Windows)命名颜色列表,包括它们的 ANSI RGB 代码,请参阅我的完整答案


0
如果您正在使用TCC shell(只需要修改一两行代码即可与CMD一起工作,因为我使用了TCC特定的%@CHAR),这里有一个方便的脚本,可以通过方便的环境变量来测试大多数ansi字符。这是我在Windows终端上的结果,它支持很多功能,但并不包括全部,比如双高度和宽行。

enter image description here


rem ANSI: Initialization 
        rem set up basic beginning of all ansi codes
            set ESCAPE=%@CHAR[27]
            set ANSI_ESCAPE=%@CHAR[27][
                set ANSIESCAPE=%ANSI_ESCAPE%

rem ANSI: special stuff: reset
            set ANSI_RESET=%ANSI_ESCAPE%0m
                set ANSIRESET=%ANSI_RESET%

rem ANSI: special stuff: position save/restore
            set ANSI_POSITION_SAVE=%ESCAPE%7%ANSI_ESCAPE%s                  %+ REM we do this the DEC way, then the SCO way
            set ANSI_POSITION_RESTORE=%ESCAPE%8%ANSI_ESCAPE%u               %+ REM we do this the DEC way, then the SCO way
                set ANSI_SAVE_POSITION=%ANSI_POSITION_SAVE%                
                set ANSI_RESTORE_POSITION=%ANSI_POSITION_RESTORE%          
            set ANSI_POSITION_REQUEST=%ANSI_ESCAPE%6n                       %+ REM request cursor position (reports as ESC[#;#R)
                set ANSI_REQUEST_POSITION=%ANSI_POSITION_REQUEST%

rem ANSI: position movement
        rem To Home
            set ANSI_HOME=%ANSI_ESCAPE%H                                    %+ REM moves cursor to home position (0, 0)
                set ANSI_MOVE_HOME=%ANSI_HOME%
                set ANSI_MOVE_TO_HOME=%ANSI_HOME%

        rem To a specific position
            function ANSI_MOVE_TO_POS1=`%@CHAR[27][%1;%2H`                  %+ rem moves cursor to line #, column #\_____ both work
            function ANSI_MOVE_TO_POS2=`%@CHAR[27][%1;%2f`                  %+ rem moves cursor to line #, column #/
                function ANSI_MOVE_POS=`%@CHAR[27][%1;%2H`                  %+ rem alias
                function ANSI_MOVE=`%@CHAR[27][%1;%2H`                      %+ rem alias
            function ANSI_MOVE_TO_COL=`%@CHAR[27][%1G`                      %+ rem moves cursor to column #
            function ANSI_MOVE_TO_ROW=`%@CHAR[27][%1H`                      %+ rem unfortunately does not preserve column position! not possible! cursor request ansi code return value cannot be captured

        rem Up/Down/Left/Right
            set ANSI_MOVE_UP_1=%ESCAPE%M                                    %+ rem moves cursor one line up, scrolling if needed
                set ANSI_MOVE_UP_ONE=%ANSI_MOVE_UP_1%                       %+ rem alias
            function ANSI_MOVE_UP=`%@CHAR[27][%1A`                          %+ rem moves cursor up # lines
                function ANSI_UP=`%@CHAR[27][%1A`                           %+ rem alias
            function ANSI_MOVE_DOWN=`%@CHAR[27][%1B`                        %+ rem moves cursor down # lines
                function ANSI_DOWN=`%@CHAR[27][%1B`                         %+ rem alias
            function ANSI_MOVE_RIGHT=`%@CHAR[27][%1C`                       %+ rem moves cursor right # columns
                function ANSI_RIGHT=`%@CHAR[27][%1C`                        %+ rem alias
            function ANSI_MOVE_LEFT=`%@CHAR[27][%1D`                        %+ rem moves cursor left # columns
                function ANSI_LEFT=`%@CHAR[27][%1D`                         %+ rem alias

        rem Line-based
            function ANSI_MOVE_LINES_DOWN=`%@CHAR[27][%1E`                  %+ rem moves cursor to beginning of next line, # lines down
            function ANSI_MOVE_LINES_UP=`%@CHAR[27][%1F`                    %+ rem moves cursor to beginning of previous line, # lines up




rem ANIS: colors 
        rem custom rgb colors
             set ANSI_RGB_PREFIX=%ANSI_ESCAPE%38;2;
             set ANSI_RGB_SUFFIX=m
             function ANSI_RGB=`%@CHAR[27][38;2;%1;%2;%3m`
                 function ANSI_FG=`%@CHAR[27][38;2;%1;%2;%3m`               %+ rem alias
                 function ANSI_RGB_FG=`%@CHAR[27][38;2;%1;%2;%3m`           %+ rem alias
                 function ANSI_FG_RGB=`%@CHAR[27][38;2;%1;%2;%3m`           %+ rem alias
             function ANSI_RGB_BG=`%@CHAR[27][48;2;%1;%2;%3m`               
                 function ANSI_BG=`%@CHAR[27][48;2;%1;%2;%3m`               %+ rem alias
                 function ANSI_BG_RGB=`%@CHAR[27][48;2;%1;%2;%3m`           %+ rem alias

        rem Foreground Colors
            set ANSI_BLACK=%ANSI_ESCAPE%30m
            set ANSI_RED=%ANSI_ESCAPE%31m
            set ANSI_GREEN=%ANSI_ESCAPE%32m
            set ANSI_YELLOW=%ANSI_ESCAPE%33m
            set ANSI_BLUE=%ANSI_ESCAPE%34m
            set ANSI_MAGENTA=%ANSI_ESCAPE%35m
            set ANSI_CYAN=%ANSI_ESCAPE%36m
            set ANSI_WHITE=%ANSI_ESCAPE%37m
            set ANSI_GRAY=%ANSI_ESCAPE%90m
            set ANSI_GREY=%ANSI_ESCAPE%90m
            set ANSI_BRIGHT_RED=%ANSI_ESCAPE%91m
            set ANSI_BRIGHT_GREEN=%ANSI_ESCAPE%92m
            set ANSI_BRIGHT_YELLOW=%ANSI_ESCAPE%93m
            set ANSI_BRIGHT_BLUE=%ANSI_ESCAPE%94m
            set ANSI_BRIGHT_MAGENTA=%ANSI_ESCAPE%95m
            set ANSI_BRIGHT_CYAN=%ANSI_ESCAPE%96m
            set ANSI_BRIGHT_WHITE=%ANSI_ESCAPE%97m
        rem Background Colors
            set ANSI_BLACKGROUND_BLACK=%@ANSI_BG[0,0,0]
            set ANSI_BACKGROUND_BLACK_NON_EXPERIMENTAL=%ANSI_ESCAPE%40m
            set ANSI_BACKGROUND_RED=%ANSI_ESCAPE%41m
            set ANSI_BACKGROUND_GREEN=%ANSI_ESCAPE%42m
            set ANSI_BACKGROUND_YELLOW=%ANSI_ESCAPE%43m
            set ANSI_BACKGROUND_BLUE=%ANSI_ESCAPE%44m
            set ANSI_BACKGROUND_MAGENTA=%ANSI_ESCAPE%45m
            set ANSI_BACKGROUND_CYAN=%ANSI_ESCAPE%46m
            set ANSI_BACKGROUND_WHITE=%ANSI_ESCAPE%47m
            set ANSI_BACKGROUND_GREY=%ANSI_ESCAPE%100m
            set ANSI_BACKGROUND_GRAY=%ANSI_ESCAPE%100m
            set ANSI_BACKGROUND_BRIGHT_RED=%ANSI_ESCAPE%101m
            set ANSI_BACKGROUND_BRIGHT_GREEN=%ANSI_ESCAPE%102m
            set ANSI_BACKGROUND_BRIGHT_YELLOW=%ANSI_ESCAPE%103m
            set ANSI_BACKGROUND_BRIGHT_BLUE=%ANSI_ESCAPE%104m
            set ANSI_BACKGROUND_BRIGHT_MAGENTA=%ANSI_ESCAPE%105m
            set ANSI_BACKGROUND_BRIGHT_CYAN=%ANSI_ESCAPE%106m
            set ANSI_BACKGROUND_BRIGHT_WHITE=%ANSI_ESCAPE%107m


REM As of Windows Terminal we can now actually display italic characters
            REM 0m=reset, 1m=bold, 2m=faint, 3m=italic, 4m=underline, 5m=blink slow, 6m=blink fast, 7m=reverse, 8m=conceal, 9m=strikethrough
            set ANSI_BOLD=%ANSI_ESCAPE%1m
            set ANSI_BOLD_ON=%ANSI_BOLD%
            set ANSI_BOLD_OFF=%ANSI_ESCAPE%22m
            set      BOLD_ON=%ANSI_BOLD_ON%
            set      BOLD_OFF=%ANSI_BOLD_OFF%
            set      BOLD=%BOLD_ON%

            set ANSI_FAINT=%ANSI_ESCAPE%2m
            set ANSI_FAINT_ON=%ANSI_FAINT%
            set ANSI_FAINT_OFF=%ANSI_ESCAPE%22m
            set      FAINT_ON=%ANSI_FAINT_ON%
            set      FAINT_OFF=%ANSI_FAINT_OFF%
            set      FAINT=%FAINT_ON%

            set ANSI_ITALICS=%ANSI_ESCAPE%3m
            set ANSI_ITALICS_ON=%ANSI_ITALICS%
            set ANSI_ITALICS_OFF=%ANSI_ESCAPE%23m
            set      ITALICS_ON=%ANSI_ITALICS_ON%
            set      ITALICS_OFF=%ANSI_ITALICS_OFF%
            set      ITALICS=%ITALICS_ON%

            set ANSI_UNDERLINE=%ANSI_ESCAPE%4m
            set ANSI_UNDERLINE_ON=%ANSI_UNDERLINE%
            set ANSI_UNDERLINE_OFF=%ANSI_ESCAPE%24m
            set      UNDERLINE_ON=%ANSI_UNDERLINE_ON%
            set      UNDERLINE_OFF=%ANSI_UNDERLINE_OFF%
            set      UNDERLINE=%UNDERLINE_ON%

            set ANSI_OVERLINE=%ANSI_ESCAPE%53m
            set ANSI_OVERLINE_ON=%ANSI_OVERLINE%
            set ANSI_OVERLINE_OFF=%ANSI_ESCAPE%55m
            set      OVERLINE_ON=%ANSI_OVERLINE_ON%
            set      OVERLINE_OFF=%ANSI_OVERLINE_OFF%
            set      OVERLINE=%OVERLINE_ON%

            set ANSI_DOUBLE_UNDERLINE=%ANSI_ESCAPE%21m
            set ANSI_DOUBLE_UNDERLINE_ON=%ANSI_DOUBLE_UNDERLINE%
            set ANSI_DOUBLE_UNDERLINE_OFF=%ANSI_ESCAPE%24m
            set      DOUBLE_UNDERLINE_ON=%ANSI_DOUBLE_UNDERLINE_ON%
            set      DOUBLE_UNDERLINE_OFF=%ANSI_DOUBLE_UNDERLINE_OFF%
            set      DOUBLE_UNDERLINE=%DOUBLE_UNDERLINE_ON%

                set ANSI_UNDERLINE_DOUBLE=%ANSI_DOUBLE_UNDERLINE%
                set ANSI_UNDERLINE_DOUBLE_ON=%ANSI_DOUBLE_UNDERLINE_ON%
                set ANSI_UNDERLINE_DOUBLE_OFF=%ANSI_DOUBLE_UNDERLINE_OFF%
                set      UNDERLINE_DOUBLE_ON=%DOUBLE_UNDERLINE_ON%
                set      UNDERLINE_DOUBLE_OFF=%DOUBLE_UNDERLINE_OFF%
                set      UNDERLINE_DOUBLE=%DOUBLE_UNDERLINE%


            set ANSI_BLINK_SLOW=%ANSI_ESCAPE%5m
            set ANSI_BLINK_SLOW_ON=%ANSI_BLINK_SLOW%
            set ANSI_BLINK_SLOW_OFF=%ANSI_ESCAPE%25m
            set      BLINK_SLOW_ON=%ANSI_BLINK_SLOW_ON%
            set      BLINK_SLOW_OFF=%ANSI_BLINK_SLOW_OFF%
            set      BLINK_SLOW=%BLINK_SLOW_ON%

            set ANSI_BLINK_FAST=%ANSI_ESCAPE%6m
            set ANSI_BLINK_FAST_ON=%ANSI_BLINK_FAST%
            set ANSI_BLINK_FAST_OFF=%ANSI_ESCAPE%25m
            set      BLINK_FAST_ON=%ANSI_BLINK_FAST_ON%
            set      BLINK_FAST_OFF=%ANSI_BLINK_FAST_OFF%
            set      BLINK_FAST=%BLINK_FAST_ON%

            set ANSI_BLINK=%ANSI_BLINK_FAST%
            set ANSI_BLINK_ON=%ANSI_BLINK_FAST_ON%
            set ANSI_BLINK_OFF=%ANSI_BLINK_FAST_OFF%
            set      BLINK_ON=%ANSI_BLINK_ON%
            set      BLINK_OFF=%ANSI_BLINK_OFF%
            set      BLINK=%BLINK_ON%

            set ANSI_REVERSE=%ANSI_ESCAPE%7m
            set ANSI_REVERSE_ON=%ANSI_REVERSE%
            set ANSI_REVERSE_OFF=%ANSI_ESCAPE%27m
            set      REVERSE_ON=%ANSI_REVERSE_ON%
            set      REVERSE_OFF=%ANSI_REVERSE_OFF%
            set      REVERSE=%REVERSE_ON%

            set ANSI_CONCEAL=%ANSI_ESCAPE%8m
            set ANSI_CONCEAL_ON=%ANSI_CONCEAL%
            set ANSI_CONCEAL_OFF=%ANSI_ESCAPE%28m
            set      CONCEAL_ON=%ANSI_CONCEAL_ON%
            set      CONCEAL_OFF=%ANSI_CONCEAL_OFF%
            set      CONCEAL=%CONCEAL_ON%

            set ANSI_STRIKETHROUGH=%ANSI_ESCAPE%9m
            set ANSI_STRIKETHROUGH_ON=%ANSI_STRIKETHROUGH%
            set ANSI_STRIKETHROUGH_OFF=%ANSI_ESCAPE%29m
            set      STRIKETHROUGH_ON=%ANSI_STRIKETHROUGH_ON%
            set      STRIKETHROUGH_OFF=%ANSI_STRIKETHROUGH_OFF%
            set      STRIKETHROUGH=%STRIKETHROUGH_ON%
                set OVERSTRIKE_ON=%STRIKETHROUGH_ON%
                set OVERSTRIKE_OFF=%STRIKETHROUGH_OFF%
                set OVERSTRIKE=%OVERSTRIKE_ON%


REM wow it even supports the vt100 2-line-tall text!
            set BIG_TEXT_LINE_1=%ESCAPE%#3
            set BIG_TEXT_LINE_2=%ESCAPE%#4
            set WIDE=%ESCAPE%#6
                set WIDE_ON=%WIDE%
                set WIDELINE=%WIDE%
                set WIDE_LINE=%WIDE%
                set WIDE_OFF=%ESCAPE%#5
            set BIG_TOP=%BIG_TEXT_LINE_1%
            set BIG_TOP_ON=%BIG_TOP%
            set BIG_BOT=%BIG_TEXT_LINE_2%
            set BIG_BOT_ON=%BIG_BOT%
            set BIG_BOTTOM=%BIG_BOT%
            set BIG_BOTTOM_ON=%BIG_BOTTOM%
            REM this is a guess:
            set BIG_TEXT_END=%ESCAPE%#0
            set BIG_OFF=%BIG_TEXT_END%
            set BIG_TOP_OFF=%BIG_OFF%
            set BIG_BOT_OFF=%BIG_OFF%


REM test strings that demonstrate all this ANSI functionality
        set ANSI_TEST_STRING=concealed:'%CONCEAL%conceal%CONCEAL_off%' %ANSI_RED%R%ANSI_ORANGE%O%ANSI_YELLOW%Y%ANSI_GREEN%G%ANSI_CYAN%C%ANSI_BLUE%B%ANSI_MAGENTA%V%ANSI_WHITE% Hello, world. %BOLD%Bold!%BOLD_OFF% %FAINT%Faint%FAINT_OFF% %ITALICS%Italics%ITALIC_OFF% %UNDERLINE%underline%UNDERLINE_OFF% %OVERLINE%overline%OVERLINE_OFF% %DOUBLE_UNDERLINE%double_underline%DOUBLE_UNDERLINE_OFF% %REVERSE%reverse%REVERSE_OFF% %BLINK_SLOW%blink_slow%BLINK_SLOW_OFF% [non-blinking] %BLINK_FAST%blink_fast%BLINK_FAST_OFF% [non-blinking] %blink%blink_default%blink_off% [non-blinking] %STRIKETHROUGH%strikethrough%STRIKETHROUGH_OFF%
        set ANSI_TEST_STRING_2=%BIG_TEXT_LINE_1%big% %ANSI_RESET% Normal One
        set ANSI_TEST_STRING_3=%BIG_TEXT_LINE_2%big% %ANSI_RESET% Normal Two
        set ANSI_TEST_STRING_4=%WIDE_LINE%A wide line!

if "%1" eq "test" (
    echo %ANSI_TEST_STRING%
    echo %ANSI_TEST_STRING_2%
    echo %ANSI_TEST_STRING_3%
    echo %ANSI_TEST_STRING_4%
)



REM unrelated to colors, but nice-to-have variables:
        set QUOTE=%@CHAR[34]  
        set TAB=%CHAR[9]
        set NEWLINE=%@CHAR[12]%@CHAR[13]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接