ANSI 转义序列(ANSI Escape Sequences)

本文转载自 Github Gist from "fnky/ANSI.md"

下面是笔者翻译版本。持续更新中。已经更完。“(?)”符号表示不确定如何翻译。

ANSI 转义序列

标准 Esc 代码以 Escape 为前缀:

  • Ctrl 快捷键: ^[
  • 八进制: \033
  • Unicode: \u001b
  • 十六进制: \x1B
  • 十进制: 27

后面跟着命令,有时用左方括号([)分隔,称为控制序列引导码(CSI),后面可选地跟着可选的参数和命令本身。

参数通过分号(;)分隔,例如:

\x1b[1;31m # 设置样式为粗体,红字。

序列

  • ESC - 以 ESC\x1B) 开头的序列
  • CSI - 控制序列引导码:以 ESC [ 或 CSI(\x9B)开头的序列
  • DCS - 设备控制字串:以 ESC P 或 DCS (\x90)开头的序列
  • OSC - 操作系统命令:以 ESC ] 或 OSC(\x9D)开头的序列

序列和参数之间的空格应该被忽略。它们的存在是为了提高可读性。

普通 ASCII 码

名字 十进制 八进制 十六进制 C 风格转义 Ctrl 快捷键 描述
BEL 7 007 0x07 \a ^G 终端响铃
BS 8 010 0x08 \b ^H 退格
HT 9 011 0x09 \t ^I 横向制表符(Tab)
LF 10 012 0x0A \n ^J 换行
VT 11 013 0x0B \v ^K 纵向制表符(Tab)
FF 12 014 0x0C \f ^L 换页 (即:New page NP)
CR 13 015 0x0D \r ^M 回车
ESC 27 033 0x1B \e* ^[ 字符 Esc
DEL 127 177 0x7F <none> <none> 字符 Delete

注意:有些控制转义序列,比如 \e 表示 ESC,并不能保证在所有语言和编译器中都能正常工作。建议使用十进制、八进制或十六进制表示作为转义码。

注意Ctrl 快捷键 表示方式只是将形如 ASCII 码 \(1\) 等的不可打印字符与 ASCII 码 \(65\)(“A”)等的可打印字符关联起来。ASCII 码 \(1\)^A(Ctrl-A),而 ASCII 码 \(7\)(BEL) 是 ^G(Ctrl-G)。这是一种常见的表示和输入方式。历史上,它们来自于 VT 系列终端之一。

光标控制

转义序列码 描述
ESC[H 将光标移回 \((0,0)\)
ESC[{line};{column}HESC[{line};{column}f 光标移到 # 行 # 列
ESC[#A 光标上移 # 行
ESC[#B 光标下移 # 行
ESC[#C 光标右移 # 列
ESC[#D 光标左移 # 列
ESC[#E 光标下移 # 行,移到行首
ESC[#F 光标上移 # 行,移到行首
ESC[#G 移动光标至列 #
ESC[6n 求光标位置 (以 ESC[#;#R 形式汇报)
ESC M 光标上移一行,按需可滚动
ESC 7 保存光标位置(DEC)
ESC 8 将光标恢复到上次保存的位置(DEC)
ESC[s 保存光标位置(SCO)
ESC[u 将光标恢复到上次保存的位置(SCO)

注意:有些序列,比如保存和恢复光标,是私有序列,没有标准化。虽然一些终端仿真器(即 xterm 和 derived)同时支持 SCO 和 DEC 序列,但它们可能具有不同的功能。因此,建议使用 DEC 序列。

擦除功能

转义序列码 描述
ESC[J 清屏(同 ESC\[0J此处可能有误,应为 ESC\[2J
ESC[0J 从光标擦到屏尾
ESC[1J 从光标擦到屏首
ESC[2J 擦除整个屏幕
ESC[3J 擦除保存的行(?)
ESC[K 整行擦除(同 ESC\[0K此处可能有误,应为 ESC\[2K
ESC[0K 从光标擦到行尾
ESC[1K 从光标擦到行首
ESC[2K 擦除整个行

注意:擦除行不会移动光标,这意味着光标将停留在该行的原位。你可以在擦除行后使用 \r,将光标返回到当前行开始处。

颜色 / 图形模式

转义序列码 对应的重置序列 描述
ESC[1;34;{...}m 设置单元格(?)的图形模式,用分号分隔 (;).
ESC[0m 重置(消除)所有颜色和图形
ESC[1m ESC[22m 粗体
ESC[2m ESC[22m 虚化(暗淡)
ESC[3m ESC[23m 斜体
ESC[4m ESC[24m 下划线
ESC[5m ESC[25m 闪烁
ESC[7m ESC[27m 反向
ESC[8m ESC[28m 隐形
ESC[9m ESC[29m 删除线

注意:一些终端可能不支持上述模式。

注意:虚化和粗体模式都用 ESC[22m 序列重置。ESC[21m 序列是双下划线模式下的非指定序列,仅在某些终端中工作,并用 ESC[24m 重置。

颜色码

大多数终端支持 8 色和 16 色,以及 256(8位)色。这些颜色由用户设置,但通常具有定义好的含义。

8-16 Colors

颜色名 前景色(字)码 背景色码
30 40
31 41
绿 32 42
33 43
34 44
品红 35 45
36 46
37 47
默认 39 49
重置 0 0

注意: 重置 色重置所有颜色、字体效果,默认 色只重置颜色。

大多数终端除了基本的 \(8\) 种颜色外,还支持“明亮”或“大胆”的颜色。它们有自己的一套代码,与正常的颜色镜像,但在代码中有一个额外的 ;1

# 设置样式为粗体,红色字(前景色)。
\x1b[1;31mHello
# 设置样式为暗淡的白色字(前景色),红色背景。
\x1b[2;37;41mWorld

支持 aixterm 规范 的终端提供明亮版本的 ISO 颜色,不需要使用 bold 修饰符:

颜色名 前景(字)色码 背景色码
亮黑 90 100
亮红 91 101
亮绿 92 102
亮黄 93 103
亮蓝 94 104
亮品红 95 105
亮青 96 106
亮白 97 107

256 色

下面的转义码告诉终端使用给定的颜色 ID:

转义序列码 描述
ESC[38;5;{ID}m 设置前景色
ESC[48;5;{ID}m 设置背景色

其中的 {ID} 应该用下面颜色表中从 \(0\)\(255\) 的颜色索引替换:

256 Color table

该表从最初的 \(16\) 种颜色(\(0\sim 15\))开始。

接下来的 \(216\) 种颜色 \((16-231)\) 可能由偏移 \(16\) 的 3bpc RGB 值组成,打包成一个值。(?)

最后的 \(24\) 种颜色是灰度色,从比黑色稍浅的颜色开始,一直到比白色稍深的颜色。

一些仿真器(?)将这些步骤解释为所有三个通道(RGB)上的线性增量(256/24),尽管一些仿真器可以明确定义这些值。

注:上图可以用以下 Python 2 代码生成

import sys
for i in range(0, 16):
    for j in range(0, 16):
        code = str(i * 16 + j)
        sys.stdout.write(u"\u001b[38;5;" + code + "m " + code.ljust(4))
    print u"\u001b[0m"

RGB 色

更多摩登的终端支持真彩色\(24\) 位 RGB),它允许你用 RGB 设置(前景、背景)颜色。

这些转移序列通常不规范。

转义序列码 描述
ESC[38;2;{r};{g};{b}m 用 RGB 设置前景色。
ESC[48;2;{r};{g};{b}m 用 RGB 设置背景色。

注意:;38;48 对应 \(16\) 种颜色序列,终端将其分别解释为设置前景色和背景色。其中,;2;5 设置颜色格式。

画面模式

设置模式

转义序列码 描述
ESC[={value}h 将屏幕宽度或类型更改为由值指定的模式。
ESC[=0h \(40 \times 25\) 黑白(文本)
ESC[=1h \(40 \times 25\) 彩色(文本)
ESC[=2h \(80 \times 25\) 黑白(文本)
ESC[=3h \(80 \times 25\) 彩色(文本)
ESC[=4h \(320 \times 200\) 4 色(图形)
ESC[=5h \(320 \times 200\) 黑白(图形)
ESC[=6h \(640 \times 200\) 黑白(图形)
ESC[=7h 启用自动换行
ESC[=13h \(320 \times 200\) 彩色(图形)
ESC[=14h \(640 \times 200\) 彩色(16 色图形)
ESC[=15h \(640 \times 350\) 黑白(2 色图形)
ESC[=16h \(640 \times 350\) 彩色(16 色图形)
ESC[=17h \(640 \times 480\) 黑白(2 色图形)
ESC[=18h \(640 \times 480\) 彩色(16 色图形)
ESC[=19h \(320 \times 200\) 彩色(256 色图形)
ESC[={value}l 使用与设置模式相同的值重置模式,但 7 除外,它将禁用自动换行。该转义序列的最后一个字符是小写 \(\texttt{L}\)

常见的专用模式

以下是一些专用模式的示例,这些模式没有在规范中定义,但在大多数终端中都能实现。

转义序列码 描述
ESC[?25l 隐藏光标
ESC[?25h 显示光标
ESC[?47l 恢复屏幕
ESC[?47h 保存屏幕
ESC[?1049h 启用替代缓冲区
ESC[?1049l 禁用替代缓冲区

有关 XTerm 定义的专用模式的更详细列表,请参阅 XTerm 控制序列

注意: 虽然大多数终端都支持这些模式,但有些模式可能无法在 tmux 等多路复用器(?)中使用。

键盘字符串(?)

ESC[{code};{string};{...}p

将键盘按键重定义为指定字符串。

此转义序列的参数定义如下:

  • code 是下表中列出的一个或多个值。这些值代表键盘按键和按键组合。在命令中使用这些值时,除了转义序列所需的分号外,还必须键入表中所示的分号。某些键盘无法使用括号中的代码。除非在 ANSI.SYSDEVICE 命令中指定 /X 开关,否则 ANSI.SYS 不会为这些键盘解释括号中的代码。
  • string 既可以是单个字符的 ASCII 代码,也可以是包含在引号中的字符串。例如,65"A" 都可以用来表示大写 \(\texttt{A}\)

重要:下表中的某些值并非对所有计算机都有效。请查阅计算机文档以了解不同的值。

键盘字符串表

SHIFT+键 码 CTRL+键 码 ALT+键 码
F1 0;59 0;84 0;94 0;104
F2 0;60 0;85 0;95 0;105
F3 0;61 0;86 0;96 0;106
F4 0;62 0;87 0;97 0;107
F5 0;63 0;88 0;98 0;108
F6 0;64 0;89 0;99 0;109
F7 0;65 0;90 0;100 0;110
F8 0;66 0;91 0;101 0;111
F9 0;67 0;92 0;102 0;112
F10 0;68 0;93 0;103 0;113
F11 0;133 0;135 0;137 0;139
F12 0;134 0;136 0;138 0;140
HOME(数字键盘) 0;71 55 0;119 --
UP ARROW(数字键盘) 0;72 56 (0;141) --
PAGE UP(数字键盘) 0;73 57 0;132 --
LEFT ARROW(数字键盘) 0;75 52 0;115 --
RIGHT ARROW(数字键盘) 0;77 54 0;116 --
END(数字键盘) 0;79 49 0;117 --
DOWN ARROW(数字键盘) 0;80 50 (0;145) --
PAGE DOWN(数字键盘) 0;81 51 0;118 --
INSERT(数字键盘) 0;82 48 (0;146) --
DELETE(数字键盘) 0;83 46 (0;147) --
HOME (224;71) (224;71) (224;119) (224;151)
UP ARROW (224;72) (224;72) (224;141) (224;152)
PAGE UP (224;73) (224;73) (224;132) (224;153)
LEFT ARROW (224;75) (224;75) (224;115) (224;155)
RIGHT ARROW (224;77) (224;77) (224;116) (224;157)
END (224;79) (224;79) (224;117) (224;159)
DOWN ARROW (224;80) (224;80) (224;145) (224;154)
PAGE DOWN (224;81) (224;81) (224;118) (224;161)
INSERT (224;82) (224;82) (224;146) (224;162)
DELETE (224;83) (224;83) (224;147) (224;163)
PRINT SCREEN -- -- 0;114 --
PAUSE/BREAK -- -- 0;0 --
BACKSPACE 8 8 127 (0)
ENTER 13 -- 10 (0
TAB 9 0;15 (0;148) (0;165)
NULL 0;3 -- -- --
A 97 65 1 0;30
B 98 66 2 0;48
C 99 66 3 0;46
D 100 68 4 0;32
E 101 69 5 0;18
F 102 70 6 0;33
G 103 71 7 0;34
H 104 72 8 0;35
I 105 73 9 0;23
J 106 74 10 0;36
K 107 75 11 0;37
L 108 76 12 0;38
M 109 77 13 0;50
N 110 78 14 0;49
O 111 79 15 0;24
P 112 80 16 0;25
Q 113 81 17 0;16
R 114 82 18 0;19
S 115 83 19 0;31
T 116 84 20 0;20
U 117 85 21 0;22
V 118 86 22 0;47
W 119 87 23 0;17
X 120 88 24 0;45
Y 121 89 25 0;21
Z 122 90 26 0;44
1 49 33 -- 0;120
2 50 64 0 0;121
3 51 35 -- 0;122
4 52 36 -- 0;123
5 53 37 -- 0;124
6 54 94 30 0;125
7 55 38 -- 0;126
8 56 42 -- 0;126
9 57 40 -- 0;127
0 48 41 -- 0;129
- 45 95 31 0;130
= 61 43 -- 0;131
[ 91 123 27 0;26
] 93 125 29 0;27
92 124 28 0;43
; 59 58 -- 0;39
' 39 34 -- 0;40
, 44 60 -- 0;51
. 46 62 -- 0;52
/ 47 63 -- 0;53
` 96 126 -- (0;41)
ENTER(主键盘) 13 -- 10 (0;166)
/(主键盘) 47 47 (0;142) (0;74)
*(主键盘) 42 (0;144) (0;78) --
-(主键盘) 45 45 (0;149) (0;164)
+(主键盘) 43 43 (0;150) (0;55)
5(主键盘) (0;76) 53 (0;143) --

Resources

posted @ 2024-04-06 16:19  Po7ed  阅读(166)  评论(0编辑  收藏  举报