前言

震惊过命令行中那些五颜六色的文本显示,使用包管理安装程序时进度条的变化,vim、Emacs等编辑器在终端中的实现。其实,这些都是Ansi Escape Codes的应用。

绝大部分Ansi Escape Codes都以\u001b开头。本文以python命令行交互环境演示。

Ansi Escape Codes的使用

字体颜色

8色

基本上所有的控制台都支持以下8种颜色:

格式: \u001b[${ID}m ID从30-37

  • 黑色:\u001b[30m
  • 红色:\u001b[31m
  • 绿色:\u001b[32m
  • 黄色:\u001b[33m
  • 蓝色:\u001b[34m
  • 洋红色:\u001b[35m
  • 青色:\u001b[36m
  • 白色:\u001b[37m
  • 重置:\u001b[0m

test.py

1
2
3
4
5
6
7
8
9
10
print('''
\u001b[30m黑色\u001b[0m
\u001b[31m红色\u001b[0m
\u001b[32m绿色\u001b[0m
\u001b[33m黄色\u001b[0m
\u001b[34m蓝色\u001b[0m
\u001b[35m洋红色\u001b[0m
\u001b[36m青色\u001b[0m
\u001b[37m白色\u001b[0m
''')

16色

大多数的控制台,除了支持刚才提到的8色外,还可以输出在此之上更加明亮的8种颜色:

格式: \u001b[${ID};1m ID从30-37

  • 亮黑色:\u001b[30;1m
  • 亮红色:\u001b[31;1m
  • 亮绿色:\u001b[32;1m
  • 亮黄色:\u001b[33;1m
  • 亮蓝色:\u001b[34;1m
  • 亮洋红色:\u001b[35;1m
  • 亮青色:\u001b[36;1m
  • 亮白色:\u001b[37;1m

亮色指令分别在原来对应颜色的指令中间加上;1

256色

除了16色外,某些控制台支持输出256色。指令的形式如下:

  • \u001b[38;5;${ID}m ID从1-255

以下示例打印出256色矩阵

1
2
3
4
5
for i in range(16):
for j in range(16):
code = i * 16 + j
print("\u001b[38;5;%dm%d" % (code, code))
print("\u001b[0m")

背景颜色

原理同字体颜色

8色:

  • 黑色背景:\u001b[40m
  • 红色背景:\u001b[41m
  • 绿色背景:\u001b[42m
  • 黄色背景:\u001b[43m
  • 蓝色背景:\u001b[44m
  • 洋红色背景:\u001b[45m
  • 青色背景:\u001b[46m
  • 白色背景:\u001b[47m

16色:

  • 亮黑色背景:\u001b[40;1m
  • 亮红色背景:\u001b[41;1m
  • 亮绿色背景:\u001b[42;1m
  • 亮黄色背景:\u001b[43;1m
  • 亮蓝色背景:\u001b[44;1m
  • 亮洋红色背景:\u001b[45;1m
  • 亮青色背景:\u001b[46;1m
  • 亮白色背景:\u001b[47;1m

256色:

  • \u001b[48;5;${ID}m

重置:

  • 仍然是 \u001b[0m

样式设置

  • 粗体:\u001b[1m
  • 下划线:\u001b[4m
  • 反色:\u001b[7m

光标控制

  • 光标向上移动:\u001b[{n}A将光标向上移动n格。
  • 光标向下移动:\u001b[{n}B将光标向下移动n格。
  • 光标向右移动:\u001b[{n}C将光标向右移动n格。
  • 光标向左移动:\u001b[{n}D将光标向左移动n格。
  • 光标按行向下移动:\u001b[{n}E将光标向下移动n行并且将光标移至行首。
  • 光标按行向上移动:\u001b[{n}F将光标向上移动n行并且将光标移至行首。
  • 设置光标所在列:\u001b[{n}G将光标移至第n列(行数与当前所在行保持一致)。
  • 设置光标所在位置:\u001b[{n};{m}H将光标移至第nm列,坐标原点从屏幕左上角开始。
  • 保存光标当前所在位置:\u001b[{s}
  • 读取光标上一次保存的位置:\u001b[{u}

参考资料

WeChat: 震惊!原来命令行还可以这么玩?!

stty的用法及解析–escape sequence code的用法