前言
最近试图用Python 实现一个 SSH Terminal,数据的发送不难,问题出在对象的返回值上,在执行某些命令的时候会返回一些 类似“x1b[22;34H\x1b[1K \x1b” 的数据。
略微做了点研究,这些数据是Terminal的一种控制指令,代表了诸如颜色,提示音,清屏,光标移动 等等含义。这里对找到的资料做了一个小结。
控制字符及转义字符通常会直接执行而不显示在终端屏幕上,但如果要自己写一个类似终端的控制,则需要对这些转义字符进行妥善处理。丢弃或者按其本意创建相应函数。
ANSI
其原名叫AESC,后更名为ANSI, ECMA-48 是ANSI 的第一个标准,后改为支持ISO 6429国际标准,其大体内容是一样的。本文例举的字符命令基本以ECMA-48为准,可能有部分存在偏差(在不同的标准下部分指令不兼容)。
ANSI 主要用来控制终端上的光标位置,颜色及其他选项。
控制字符
Hex | 字符 | 描述 |
---|---|---|
\x00 | \0 | Null |
\x05 | ENQ 触发应答消息 | |
\x07 | \a | Bell 响铃,当你在terminal中做某些无效操作的时候,返回\x07 |
\x08 | \b | BackSpace 退格键(发送退格键,if 在行首返回\x07 else 返回\x08\x1b[K,具体含义见后续) |
\x09 | \t | Horizontal Tab 横向跳至下一个制表位,若后面没有制表位,则跳至行尾 |
\x0a | \n | Line Feed 光标下移一行(终端中表现为换行) |
\x0b | \v | Vertical Tab 竖向跳至下一个制表位(终端中表现为换行) |
\x0c | \f | Form Feed 光标跳转至下一页头部(终端中表现为换行) |
\x0d | \r | Carriage Return 回车换行 |
\x0e | SO 激活 G1 字符集 | |
\x0f | SI 激活 G0 字符集 | |
\0x11 | \q | DC1 继续传送 |
\0x13 | \s | DC3 忽略除XOFF 和 XON 以外的一切字符 |
\x18 | CAN 实质 Ctrl+X 中断转义序列/进程 | |
\x1a | \z | SUB(EOF) 实质 Ctrl+Z 中断转义序列/进程 |
\x1b | \e | Escape 开始一个新的转义序列 |
\x7f | DEL 忽略 | |
\x9b | CSI 控制序列;等同于 ESC[ (\x1b[) |
ESC 非转义控制序列
ESC | 描述 | |
---|---|---|
\x1bc | RIS | 重绘屏幕,清屏,类似linux命令clear(注意大小写) |
\x1bD | IND | 光标下移一行,不改变其列 |
\x1bE | NEL | 换新的一行,类似 ‘\n’ |
\x1bH | HTS | 设置当前列为制表位,类似 ‘\t’ |
\x1bM | RI | 反转换行,光标上移一行,不改变其列 |
\x1bZ | DECID | DEC私有定义,ubuntu内核释义为返回字符ESC[?6c |
\x1b7 | DECSC | 存储当前状态(光标位置,属性,字符集) |
\x1b8 | DECRC | 恢复存储设置 |
\x1b[ | CSI | 控制序列介绍 |
\x1b%n | 开始一个字符集选择序列,n可为@,G。@代表默认值(ISO 646/ISO 8859-1),G代表UTF-8 | |
\x1b#8 | DECALN | DEC 屏幕校准测试,使用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[nA | CUU-光标上移 | n为整数(默认为1),光标上移n行,不改变列位置,若已在顶层,忽略不计 |
\x1b[nB | CUD-光标下移 | n为整数(默认为1),光标下移n行,不改变列位置,若已在底层,忽略不计 |
\x1b[nC | CUF-光标前移 | n为整数(默认为1),光标前移n列,不改变行,若已在最左侧,忽略不计 |
\x1b[nD | CUB-光标后移 | n为整数(默认为1),光标后移n列,不改变行,若已在最右侧,忽略不计 |
\x1b[nE | CNL-光标移到下一行 | n为整数(默认为1),光标移到下面第n行行首 |
\x1b[nF | CPL-光标移到上一行 | n为整数(默认为1),光标移到上面第n行行首 |
\x1b[nG | CHA-光标水平绝对移动 | n为整数(默认为1)光标移动到第n列。 |
\x1b[n;mH | CUP-光标位置 | n,m为整数,(默认为1)光标移到第n行,第n列。 |
\x1b[nJ | ED-擦除显示 | n可选0,1,2,3,默认为0。为0时,从光标位置到屏幕末尾擦除;为1时,从屏幕首部到光标位置擦除;为2时,擦除全屏;为3时,擦除全屏,并清空缓存区。该操作,对整行被清除的行属性变为单宽单高。 |
\x1b[?nJ | 该指令基本同上,只清除”可清除“字符,不影响其它字符及行属性。 | |
\x1b[nK | EL-擦除行 | n可选0,1,2,默认为0。为0时,从光标位置到该行行尾擦除;为1时,从该行行首到光标位置擦除;为2时,擦除整行。该操作对行属性无影响。 |
\x1b[?nK | 该指令基本同上,只清除”可清除“字符,不影响其它字符及行属性。 | |
\x1b[L | IL | 在空行插入# ?? |
\x1b[M | DL | 删除#标记的行 ?? |
\x1b[P | DCH | 删除当前行中#标记的字符 ?? |
\x1b[nS | SU | n为整数(默认为1),整页向上滚动n行 |
\x1b[nT | SD | n为整数(默认为1),整夜向下滚动n行 |
\x1b[X | ECH | 删除当前行中#标记的单词 ?? |
\x1b[a | HPR | 光标移动到#标记的右边 ?? |
\x1b[c | DA | 以 ESC[?6C:处理 |
\x1b[nd | VPA | n为整数(默认为1),光标移动到当前列指定行 |
\x1b[e | VPR | 光标移动到#标记的下一行 ?? |
\x1b[f | HVP | 光标移动到指定的行和列(与\x1b[H类似) |
\x1b[ng | TBC | n可为0,3(默认为0). 为0时,删除当前位置的制表符,为3时,删除所以制表符。 |
\x1b[nh | SM | 设置模式,详见下文 |
\x1b[ni | 辅助串行端口,常用于本地打印机,n为5代表启用,4代表禁用 | |
\x1b[nl | RM | 重置模式,详见下文,其功能与\x1b[nh相对 |
\x1b[m | SGR | 选择图形再现(设置文字属性),详见下文 |
\x1b[n | DSR | 状态报告,详见下文 |
\x1b[nq | DECLL | 设置键盘指示灯,n可取0,1,2,3. 0代表熄灭所有灯,1代表点亮scroll lock灯,2代表点亮Num Lock 灯,3代表点亮Caps Lock灯。 |
\x1b[n;mr | DECSTBM | 设置滚动范围;n,m参数分别为首行和末行 |
\x1b[s | 存储光标位置 | |
\x1b[u | 恢复光标位置 | |
\x1b[n` | HPA | n为整数(默认为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-37m | 30:黑色前景;31:红色前景;32:绿色前景;33:棕色前景;34:蓝色前景;35:品红前景;36:孔雀蓝前景;37:白色前景 |
\x1b[38m | 设置RGB前景色 |
\x1b[39m | 设置默认前景色 |
\x1b[40-47m | 40:黑色背景;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版权协议,转载请附上原文出处链接和本声明。