Escape sequence
Escape Sequence
Escape sequences 是一种用于编程和数据通信中的特殊字符序列, 用于表示那些不能直接在代码或文本中表示的控制字符或特殊字符.
wiki上介绍的很详细, 特殊的转义字符可以完成很多好玩的事情, 比如改变 font, font color, cursor, 可以用来执行一些 system control.
Escape Sequences type
-
直接表示 ASCII characters
\n(newline),\t(tab),\\(backslash),\a(bell),\b(backspace). 通过man ASCII可以直接查看, 这里的 n t 为简写, 实际上可以用不同进制的数来写
-
ANSI Escape Sequences
-
以
<ESC>的 ASCII 码为开头, 可以为\033(8 进制) or\x1b(16 进制) or\e, 接相应的字符来表示不同的功能,<ESC>在 vim 里显示为^[ -
powershell 的默认转义符号不为
\, 为`, 因为 windows 下这玩意是路径分隔符 -
<ESC>\或者\x9c一般表示为 ST, 为 String terminator, 但是现在\a, 也就是 bell 也可以为此作用, stackoverflow上写了这个来由, 这个不是标准行为, 但大家都这么用
-
Control Sequence Introducer (CSI)
-
CSI 格式以
<ESC>的 ASCII 开头, 接[符号, 这种特殊的格式便可以用来定义 font, cursor 等, Wiki 中给出了一些 squeunce 例子- CSI =
\e[
- CSI =
-
cursor 相关
-
<CSI>nA, Cursor UP n line,<CSI>nECursor n Next line,<CSI>n;mHcursor position row n, column m<CSI>nSScroll Up n line -
<CSI>n q, 可以改变光标形状 -
<CSI>?25h,<CSI>?25l显示隐藏光标
-
-
此外还有清屏的
<CSI>J清除当前屏,<CSI>2J, 清除所有
-
另外一个比较常用是
<CSI>nm用来改变文字的格式, 也就是 SGR
echo -ne "\e[1;10H"
SGR(Select Graphic Rendition), <CSI>nm
这里选择几个比较常见的 SGR, 具体可以见 wiki
-
<CSI>0m, 关闭所有设置 -
n 从 1-29 都是一些 style 设置,30 开始至 49 都是设置颜色, 往后又是一些 style 设置, 至 90 开始是亮色的设置
- 颜色 FG(foreground) 范围在 30-37, 90-97(bright color), BG(background) 40-47, 100-107(bright color)
-
以上都是 3-bit or 4-bit 色, 8bit 色便有自己独特的格式
<ESC>[38;5;nm(FG)<ESC>[48;5;nm(BG)- 此处的 n 可以为以下值
- 0-7: standard colors (as in ESC [ 30–37 m)
- 8-15: high intensity colors (as in ESC [ 90–97 m)
- 16-231: 6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5)
- 232-255: grayscale from dark to light in 24 steps
- 此处的 n 可以为以下值
-
24-bit true color 也有自己的独特的格式
<ESC>[38;2;r;g;bm, r, g, b 对应色的 RGB
# 8 bit color
echo "\e[38;5;200m some_text"
# true color
echo "\e[38;2;100;1;100m some_text"
OSC(Operating System Command)
-
OSC 大部分由 xterm 定义, Xterm 选择可以用 BEL (0x07) 或者标准 ST (0x9C or 0x1B 0x5C) 来结束命令, 这部分很多时候由终端决定
- OSC =
<ESC>]…some bytes…<ST>or<BEL>
- OSC =
-
Fs Escape, OSC 接一个 0x60-0x7E 之间的为 ISO-IR registry 可以用来控制输入
-
Fp Escape, 0x30-0x3F, 一些 private-use, 比如记住光标位置, 回溯光标
-
<OSC>52;c;text\a, 是可以控制系统剪切版的 Sequence, 此处的 text 需要时 base64 编码, c 是指定的剪贴板, 可以是 c(clipboard)、p(primary)、s(Secondary) 等,分别代表不同的剪切板, p, s 不太常用 -
<OSC>0;text\a, 是可以控制终端标题 -
其他还有很多, 可以问 chatgpt, 基本就是终端控制
# 设置剪切板为 hello
# 以 OSC 开头, 设置剪切板为 c, 接 base64 文本, 接终止符号 \a
echo -ne "\e]52;c;$(echo hello | base64)\a"
tput
- tput 其实就是一个打印 escape sequence 的工具, 将抽象的 escape sequence 转换为可读的命令输入
vim auto change cursor in cmd mode
set show-mode-in-prompt on
set vi-cmd-mode-string "\1\e[1 q\2"
set vi-ins-mode-string "\1\e[5 q\2"
\1, \2 表示 psreadline 的 escape sequence 语法
bash escape sequence
- 此处 less 便会接收到 escape string, -R 使其可以解释 escape string
echo -e "\e[31mThis is red text\e[0m" | less -R
- 通过 sed 过滤 escape string
sed 's/\x1b\[[0-9;]*m//g'
vim escape sequence
- 在 vim 中,
\r实际被表现为^M,\e实际表现为^[ - 其实就是用字符加
^来代表控制字符, ASCII 值偏差 64 \rASCII 是 13,M的 ASCII 77(13 + 64)\eASCII 为 27,[的 ASCII 91(64 + 27)