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

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

2020-05-17 19:47:27发布 浏览数:998
概述: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 \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

请先
登录
后评论
0 条评论
暂时没有评论
最新文章
更多