Terminal ANSI Escape sequences 终端 ANSI 转义序列(终端指令)

前言

最近试图用Python 实现一个 SSH Terminal,数据的发送不难,问题出在对象的返回值上,在执行某些命令的时候会返回一些 类似“x1b[22;34H\x1b[1K \x1b” 的数据。
略微做了点研究,这些数据是Terminal的一种控制指令,代表了诸如颜色,提示音,清屏,光标移动 等等含义。这里对找到的资料做了一个小结。
控制字符及转义字符通常会直接执行而不显示在终端屏幕上,但如果要自己写一个类似终端的控制,则需要对这些转义字符进行妥善处理。丢弃或者按其本意创建相应函数。

ANSI

其原名叫AESC,后更名为ANSI, ECMA-48 是ANSI 的第一个标准,后改为支持ISO 6429国际标准,其大体内容是一样的。本文例举的字符命令基本以ECMA-48为准,可能有部分存在偏差(在不同的标准下部分指令不兼容)。
ANSI 主要用来控制终端上的光标位置,颜色及其他选项。

控制字符

Hex字符描述
\x00\0Null
\x05ENQ 触发应答消息
\x07\aBell 响铃,当你在terminal中做某些无效操作的时候,返回\x07
\x08\bBackSpace 退格键(发送退格键,if 在行首返回\x07 else 返回\x08\x1b[K,具体含义见后续)
\x09\tHorizontal Tab 横向跳至下一个制表位,若后面没有制表位,则跳至行尾
\x0a\nLine Feed 光标下移一行(终端中表现为换行)
\x0b\vVertical Tab 竖向跳至下一个制表位(终端中表现为换行)
\x0c\fForm Feed 光标跳转至下一页头部(终端中表现为换行)
\x0d\rCarriage Return 回车换行
\x0eSO 激活 G1 字符集
\x0fSI 激活 G0 字符集
\0x11\qDC1 继续传送
\0x13\sDC3 忽略除XOFF 和 XON 以外的一切字符
\x18CAN 实质 Ctrl+X 中断转义序列/进程
\x1a\zSUB(EOF) 实质 Ctrl+Z 中断转义序列/进程
\x1b\eEscape 开始一个新的转义序列
\x7fDEL 忽略
\x9bCSI 控制序列;等同于 ESC[ (\x1b[)

ESC 非转义控制序列

ESC描述
\x1bcRIS重绘屏幕,清屏,类似linux命令clear(注意大小写)
\x1bDIND光标下移一行,不改变其列
\x1bENEL换新的一行,类似 ‘\n’
\x1bHHTS设置当前列为制表位,类似 ‘\t’
\x1bMRI反转换行,光标上移一行,不改变其列
\x1bZDECIDDEC私有定义,ubuntu内核释义为返回字符ESC[?6c
\x1b7DECSC存储当前状态(光标位置,属性,字符集)
\x1b8DECRC恢复存储设置
\x1b[CSI控制序列介绍
\x1b%n开始一个字符集选择序列,n可为@,G。@代表默认值(ISO 646/ISO 8859-1),G代表UTF-8
\x1b#8DECALNDEC 屏幕校准测试,使用E’s 填充整个终端??
\x1b(n开始一个G0字符集定义序列,n可为B,0,U,K. B代表默认字符集(ISO 8859-1 mapping);0代表vt100图形映射;U代表空映射,直接访问字符ROM;K代表用户映射,由mapscrn(8)加载。
\x1b)n开始一个G1字符集定义序列,n可选值及效果同上
\x1b>DECPNM设置数字小键盘模式
\x1b=DECPAM设置程序键盘模式
\x1b]OSC(是perating system command的缩写 ESC ] P nrrggbb: 设置调色板,后面紧跟7个十六进制数,再跟一个 P :- /(. 这里 n 是颜色(0-16),而 rrggbb 表示红/绿/蓝 值(0-255).ESC ] R: 重置调色板

ESC 控制转义序列

ESC[后面跟的参数序列多为由分号隔开的十进制数,缺省值通常为0 。

CSI名称描述
\x1b[nACUU-光标上移n为整数(默认为1),光标上移n行,不改变列位置,若已在顶层,忽略不计
\x1b[nBCUD-光标下移n为整数(默认为1),光标下移n行,不改变列位置,若已在底层,忽略不计
\x1b[nCCUF-光标前移n为整数(默认为1),光标前移n列,不改变行,若已在最左侧,忽略不计
\x1b[nDCUB-光标后移n为整数(默认为1),光标后移n列,不改变行,若已在最右侧,忽略不计
\x1b[nECNL-光标移到下一行n为整数(默认为1),光标移到下面第n行行首
\x1b[nFCPL-光标移到上一行n为整数(默认为1),光标移到上面第n行行首
\x1b[nGCHA-光标水平绝对移动n为整数(默认为1)光标移动到第n列。
\x1b[n;mHCUP-光标位置n,m为整数,(默认为1)光标移到第n行,第n列。
\x1b[nJED-擦除显示n可选0,1,2,3,默认为0。为0时,从光标位置到屏幕末尾擦除;为1时,从屏幕首部到光标位置擦除;为2时,擦除全屏;为3时,擦除全屏,并清空缓存区。该操作,对整行被清除的行属性变为单宽单高。
\x1b[?nJ该指令基本同上,只清除”可清除“字符,不影响其它字符及行属性。
\x1b[nKEL-擦除行n可选0,1,2,默认为0。为0时,从光标位置到该行行尾擦除;为1时,从该行行首到光标位置擦除;为2时,擦除整行。该操作对行属性无影响。
\x1b[?nK该指令基本同上,只清除”可清除“字符,不影响其它字符及行属性。
\x1b[LIL在空行插入# ??
\x1b[MDL删除#标记的行 ??
\x1b[PDCH删除当前行中#标记的字符 ??
\x1b[nSSUn为整数(默认为1),整页向上滚动n行
\x1b[nTSDn为整数(默认为1),整夜向下滚动n行
\x1b[XECH删除当前行中#标记的单词 ??
\x1b[aHPR光标移动到#标记的右边 ??
\x1b[cDA以 ESC[?6C:处理
\x1b[ndVPAn为整数(默认为1),光标移动到当前列指定行
\x1b[eVPR光标移动到#标记的下一行 ??
\x1b[fHVP光标移动到指定的行和列(与\x1b[H类似)
\x1b[ngTBCn可为0,3(默认为0). 为0时,删除当前位置的制表符,为3时,删除所以制表符。
\x1b[nhSM设置模式,详见下文
\x1b[ni辅助串行端口,常用于本地打印机,n为5代表启用,4代表禁用
\x1b[nlRM重置模式,详见下文,其功能与\x1b[nh相对
\x1b[mSGR选择图形再现(设置文字属性),详见下文
\x1b[nDSR状态报告,详见下文
\x1b[nqDECLL设置键盘指示灯,n可取0,1,2,3. 0代表熄灭所有灯,1代表点亮scroll lock灯,2代表点亮Num Lock 灯,3代表点亮Caps Lock灯。
\x1b[n;mrDECSTBM设置滚动范围;n,m参数分别为首行和末行
\x1b[s存储光标位置
\x1b[u恢复光标位置
\x1b[n`HPAn为整数(默认为1),光标移动到当前行指定列

\x1b[h 与\x1b[l (小写 L) 指令一览

指令描述
ECMA-48 模式选择
\x1b[2h锁存键盘数据(不超过15个)暂停向主机发送,直到开放为止。
\x1b[2l允许键盘向主机发送数据。
\x1b[3h打开显示控制字符,供调试使用
\x1b[3l取消显示控制字符,正常运行
\x1b[4h设置插入模式(INSERT MODE, 输入内容替换光标所在位置的内容)
\x1b[4l取消插入模式
\x1b[5h击键声有效
\x1b[5l击键声无效
\x1b[20h在CR ("\r")后自动添加LF,VT或FF("\n")
\x1b[20l取消自动添加
以下内容为DEC 私有模式序列l替换h即为重设该模式,以下不重复例举,具体形式参考上述部分
\x1b[?1h打开时光标键送出ESC O 前缀,(默认ESC [)
\x1b[?3h选择132列模式(默认80列)
\x1b[?4h设置平滑滚动(默认跳跃滚动)
\x1b[?5h显示反转,显示为白底黑字(默认黑底白字)
\x1b[?6h以用户指定的滚动区域的首行行首为参考原点(默认以屏幕首行行首为原点)
\x1b[?7h打开自动换行,超过设定列数自动换行(默认到行尾覆盖原有文字)
\x1b[?8h允许键盘连发
\x1b[?9h设置x10鼠标报告模式1(或重设为0)(默认关闭)
\x1b[?25h设置光标可见(默认可见,l 隐藏)
\x1b[?67h作为退格键发送BS(默认作为删除键发送DEL)
\x1b[?1000h设置x11鼠标报告模式2(或重设为0)(默认关闭)
以下部分为终端屏幕尺寸设置除了\x1b[=7h,其余指令都可以通过\x1b[=nl重置,n为对应值
\x1b[=0h显示为 40*25 黑白 文本
\x1b[=1h显示为 40*25 彩色 文本
\x1b[=2h显示为 80*25 黑白 文本
\x1b[=3h显示为 80*25 彩色 文本
\x1b[=4h显示为 320*400 四色 图像
\x1b[=5h显示为 320*200 黑白 图像
\x1b[=6h显示为 640*200 黑白 图像
\x1b[=7h允许自动换行
\x1b[=13h显示为 320*200 彩色 图像
\x1b[=14h显示为 640*200 16色 图像
\x1b[=15h显示为 640*350 黑白 图像
\x1b[=16h显示为 640*350 16色 图像
\x1b[=17h显示为 640*480 黑白 图像
\x1b[=18h显示为 640*480 16色 图像
\x1b[=19h显示为 320*200 256色 图像

ECMA-48 状态报告命令

指令描述
\x1b[5n设备状态报告(DSR):以 ESC [ 0 n 应答
\x1b[6n光标位置报告(CDR):以 ESC [ y;x R应答,x,y为光标位置
\x1b[?15n报告打印机状态,应答内容 (ESC[?13n 无打印机;ESC[?10n打印机就绪;ESC[?11n 未准备好。)
\x1b[?25n报告自定义键状态,应答内容(ESC[?20n 允许; ESC[?21n锁定)

SGR 参数意义 (\x1b[…m)

指令描述
\x1b[0m所有属性重设为默认值,通常出现在一串指令的最后
\x1b[1m设置粗体,高亮
\x1b[2m设置亮度减半(用一种颜色模拟另一种颜色)
\x1b[4m设置下划线,下划线的颜色由”\x1b]…“设置
\x1b[5m设置闪烁
\x1b[7m设置反显,前景色与背景色交换(字体颜色与背景颜色)
\x1b[8m隐藏,前景色与背景色同色
\x1b[9m设置删除线(示例效果:谁也逃不过王境泽定律
\x1b[10m重设选定映像,显示控制标记,反转元素标记
\x1b[11m选择空映像,设置显示控制标记,重设反转标记.
\x1b[12m选择空映像,设置显示控制标记,重设反转标记.(在完成映像表转换之前反转标记引起每一字节的高位反转.)
\x1b[21m设置正常亮度(与ECMA-48 不兼容)
\x1b[22m设置正常亮度
\x1b[24m关闭下划线
\x1b[25m关闭闪烁
\x1b[27m关闭反显
\x1b[28m关闭影藏
\x1b[29m关闭删除线
\x1b[30-37m30:黑色前景;31:红色前景;32:绿色前景;33:棕色前景;34:蓝色前景;35:品红前景;36:孔雀蓝前景;37:白色前景
\x1b[38m设置RGB前景色
\x1b[39m设置默认前景色
\x1b[40-47m40:黑色背景;41:红色背景;42:绿色背景;43:棕色背景;44:蓝色背景;45:品红背景;46:孔雀蓝背景;47:白色背景
\x1b[48m设置RGB背景色
\x1b[53m设置上划线
\x1b[55m关闭上划线
\x1b[90-97m设置前景色,颜色同30-37,亮度提升
\x1b[100-107m设置背景色,颜色同41-47,亮度提升

SGR指令能够在一条指令中添加多个属性,例如\x1b[5;9;30;41m 即为设置闪烁,下划线,黑色字体红色背景。
在Xterm, KDE 的konsole,以及支持libvte的终端上支持如下指令:
\x1b[38;2;r;g;bm 选择RGB前景色
\x1b[48;2;r;g;bm 选择RGB背景色

参考资料

1.Ubuntu ManagePage:控制终端代码
2.[terminal]终端仿真程序
3.ANSI 终端输出瞎搞指北 作者: Amatist Kurisu
4.ANSI Escape sequences
5.Control Sequences


版权声明:本文为weixin_43988842原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。