CSI 转义码 —— 光标、擦除、滚动、定位
Control Sequence Introducer。`ESC [` 家族中扣除 SGR 子集后剩余的部分 —— 光标移动(上 / 下 / 左 / 右 / 列 / 绝对定位)、擦除(行 / 屏)、滚动、保存 / 恢复,以及少量用于窗口与光标状态查询的 CSI 序列。
60 条序列
CSI 食谱 —— 整族六大用途
CSI(Control Sequence Introducer)是转义码方言里最活跃的一族 —— 60 多个结尾字节几乎覆盖除了调色板 + 外壳之外的所有动作(那两类归 SGR 与 OSC)。下面六步:先认信封语法本身、再是光标移动、屏幕 / 行擦除、终端通过 stdin 回复的往返查询、TUI 划出固定区域用的滚动区与边距设置,最后是省去整屏重绘开销的局部插入 / 删除 / 光标形状操作。
1. 信封 ——
\x1b[……<结尾字节>每条 CSI 序列都是
\x1b[(ESC[)起头,紧接可选的**私有前缀**(DEC 私有模式用?,xterm 定义的变种用</=/>),随后是零个或多个用;分隔的数字参数,最后一个\x40–\x7E范围的**结尾字节**决定动作。和 OSC 不同,CSI 不需要结束符 —— 结尾字节自己就是结束。SGR 用m(\x1b[31m),ED 用J,EL 用K,CUP(光标定位)用H,DSR 用n,DA 用c—— ECMA-48 + xterm 加起来有 60 多个在用的结尾字节。参数会按动作默认成 1 或 0;省略等价于默认值,所以\x1b[A(上移一行)和\x1b[1A完全等价。还有个 8-bit CSI 形式\x9b …,老 VT 手册里能见到,实战里基本绝迹。2. 光标移动 —— CUU / CUD / CUF / CUB + CUP + CHA / VPA
撑起每个 TUI 的八条光标原语。**CUU / CUD / CUF / CUB**(
\x1b[NA/B/C/D)让光标上 / 下 / 前 / 后移N格(默认 1),不会越出屏幕边界。**CUP**(\x1b[r;cH,别名f)直接跳到行r列c(从 1 开始计)。**CHA**(\x1b[NG)和 **VPA**(\x1b[Nd)跳到绝对列 / 绝对行,另一轴保持不动。**CNL / CPL**(\x1b[NE/F)向下 / 向上 N 行的同时把列重置到 1 —— 适合段落式光标流。**SCOSC / SCORC**(\x1b[s/\x1b[u)保存 / 恢复一个光标槽位 —— 比 DECSC\x1b7/ DECRC\x1b8资历更老,但在所有现代终端上效果完全一致。3. 擦除 —— ED
J与 ELK两个结尾字节负责所有擦除:**
J** 擦屏幕,**K** 擦行。每个都接一个范围参数:0(默认)从光标到末尾,1从开头到光标,2整屏 / 整行,J还有3连滚动历史一起清(xterm 扩展,多数现代终端支持)。每个 TUI 启动时都会发的「清屏并归位」组合就是\x1b[2J\x1b[H—— 擦掉整屏,再把光标移到第 1 行第 1 列。**ECH**\x1b[NX(见第 6 节)是就地变种:把 N 格覆盖成空白但不移动其他内容。要做局部重绘,先 CUP 跳过去再发\x1b[K(擦到行尾)是清掉一行准备重画最省的写法。4. 查询 —— DA、DA2、DSR、DECRQM
终端会通过 **stdin** 回复的往返查询 —— 发出查询的程序必须读响应,否则它会泄到下一次用户输入里。**DA**
\x1b[c(主设备属性)问「你是谁?」—— 现代终端回\x1b[?<id>;<feature>;<feature>c,宣告 VT100 / VT200 / VT400 基础类 + 支持的特性(sixel、regis、彩色等)。**DA2**\x1b[>c返回型号 + 固件版本 —— 用来分辨 iTerm2 / kitty / xterm。**DSR**\x1b[6n(光标位置)回\x1b[r;cR;\x1b[5n返回终端 OK 状态。**DECRQM**\x1b[?<n>$p读 DEC 私有模式n当前是 set / reset / permanent / unsupported(回复里的0/1/2/3/4)。用途:在发\x1b[?1049h之前先检测 alt-screen 支持。5. 边距与滚动区 —— DECSTBM
r与 DECSLRMs**DECSTBM**
\x1b[<top>;<bottom>r把滚动区域设为top–bottom行(从 1 开始、含端点)。在这个区域内,向上 / 向下滚动(\x1b[NS/\x1b[NT)和 IL / DL 只影响这几行,其余屏幕保持不动。最经典的用法是底部的常驻状态栏 —— 设\x1b[1;<screenrows-1>r,状态行永远不会滚走。要恢复全屏滚动,发不带参数的\x1b[r。**DECSLRM**\x1b[<left>;<right>s同样规则设水平边距,但要先开 DECLRMM(\x1b[?69h)才生效 —— 多数 TUI 完全不碰水平边距。没开 DECLRMM 时\x1b[s会被解读为 SCOSC(保存光标)—— 跨终端移植代码时最经典的模式混淆陷阱。6. 插入 / 删除 / 光标形状 —— IL / DL / ICH / DCH / ECH + DECSCUSR
不必整屏重绘的局部编辑。**IL**
\x1b[NL在光标处插入 N 空行,把现有内容下推(推出滚动区)。**DL**\x1b[NM删除 N 行,把内容上拉。**ICH**\x1b[N@与 **DCH**\x1b[NP在单行的列轴上做同样事。**ECH**\x1b[NX在原位擦 N 格 —— 覆盖成空白但不移动其他内容,是清掉已知宽度字段最对路的原语。**DECSCUSR**\x1b[N q选光标形状:1闪烁方块(默认)、2稳定方块、3闪烁下划线、4稳定下划线、5闪烁竖线、6稳定竖线 —— vim 的terminal-mode在2和6之间切换以显示 insert vs normal 模式。被 xterm、kitty、iTerm2、wezterm、alacritty、ghostty、Windows Terminal、gnome-terminal 3.16+、konsole 支持;Linux console 忽略。
本家族的全部序列
- CUU / CUD / CUF / CUB — 移动光标
\x1b[NA (up; B down, C right, D left)将光标向上 / 下 / 右 / 左 移动 N 格。
- CNL / CPL — 光标下/上行
\x1b[NE (down N lines, col 1) \x1b[NF (up)将光标移动到下方(CNL)或上方(CPL)第 N 行的第 1 列。
- CHA — 光标水平绝对位置(列)
\x1b[NG将光标移动到当前行的第 N 列(从 1 开始)。
- CUP — 设置光标位置
\x1b[row;colH将光标移动到绝对行/列(从 1 开始)。
- ED — 清屏 (`\x1b[2J`)
\x1b[NJ擦除屏幕的部分或全部。
- EL — 行内擦除 (`\x1b[K`)
\x1b[NK擦除当前行的部分或全部。
- SU / SD — 向上 / 向下滚动
\x1b[NS (scroll up) \x1b[NT (scroll down)将屏幕内容向上(SU)或向下(SD)滚动 N 行,光标位置不变。
- DECSCUSR — 光标形状
\x1b[N\x20q (N = 0..6)切换光标形状:方块、下划线或竖线(可选是否闪烁)。
- DECSTR — 软终端重置
\x1b[!p将 DEC 私有模式与 SGR 重置为默认,但不清屏,也不清回滚缓冲。
- CBT — 光标反向制表(CSI Z)
\x1b[NZ将光标回退 N 个 tab 停位 —— 与按 Tab 键方向相反。
- TBC — 清除制表位(CSI g)
\x1b[g (clear current) \x1b[3g (clear all)清除一个或全部 tab 停位,改变 HT 和 CBT 的落点。
- DECSTBM — 设置上下边距(CSI r)
\x1b[T;Br定义垂直滚动区域 —— 区域外的行被固定,区域内的行参与滚动。
- SCOSC / SCORC — 保存 / 恢复光标(CSI s / u)
\x1b[s (save) \x1b[u (restore)CSI 风格的光标位置保存(s)与恢复(u)—— 与 ESC 7 / ESC 8(DECSC / DECRC)有别。
- CHT — 光标正向制表(CSI I)
\x1b[NI把光标按 tab 停位向前推进 N 次 —— Tab 键的可带参数版本。
- DA — 设备属性查询(CSI c / CSI > c)
\x1b[c (primary DA) \x1b[>c (secondary DA)询问终端的 VT 类型 —— 主查询(CSI c)返回支持特性,副查询(CSI > c)返回型号与固件。
- DSR — 设备状态报告(CSI 5n / CSI 6n)
\x1b[5n (status request) \x1b[6n (cursor pos request)查询终端状态(5n)或当前光标位置(6n)—— TUI 用以测量终端大小的反向通道。
- DECRQM — 模式状态查询(CSI ? Ps $ p)
\x1b[?Ps$p询问终端某个 DEC 私有模式是否已启用 —— 运行时特性检测的标准方式。
- ICH — 插入字符(CSI Pn @)
\x1b[Pn@把当前行剩余内容右移 N 格并以空白填充间隙 —— vim 插入模式的底层原语。
- DCH — 删除字符(CSI Pn P)
\x1b[PnP删除光标处 N 个单元,把剩余内容左移填补 —— ICH 的逆操作。
- IL — 插入行(CSI Pn L)
\x1b[PnL在光标所在行打开 N 行空行,把后续行向下推(在滚动区域内)—— vim 'O' 命令的底层原语。
- DL — 删除行(CSI Pn M)
\x1b[PnM删除从光标所在行起的 N 行,把后续行向上拉(在滚动区域内)—— vim 'dd' 命令的底层原语。
- ECH — 擦除字符(CSI Pn X)
\x1b[PnX在光标处原地擦除 N 个单元 —— 形状与 DCH 相同,但行剩余内容不左移。
- REP — 重复前一个字符(CSI Pn b)
\x1b[Pnb把上一字符重复打印 N 次 —— 节省同字符长串带宽的小窍门。
- VPA — 垂直行绝对定位(CSI d)
\x1b[<row>d将光标移动到绝对行,保持当前列不变。
- HVP — 水平与垂直定位(CSI f,CUP 的别名)
\x1b[<row>;<col>f将光标移动到绝对 (row, col) —— 语义与 CUP 完全相同,仅末字节用 `f` 而非 `H`。
- XTWINOPS — 窗口操作(CSI Ps ; Ps ; Ps t)
\x1b[<Ps>t or \x1b[<Ps>;<Pa>;<Pb>txterm 的窗口操作族 —— 调整大小、最小化、置顶/置底、查询尺寸、推入/弹出标题。
- DECSED / DECSEL — 选择性擦除屏幕 / 行(CSI ? Ps J / CSI ? Ps K)
\x1b[?<Ps>J (DECSED) \x1b[?<Ps>K (DECSEL)仅擦除未受保护的单元 —— 显示区(DECSED)或当前行(DECSEL)。即 ED / EL 的私有模式对照。
- SL / SR — 左滚 / 右滚(CSI Ps SP @ / CSI Ps SP A)
\x1b[<Ps> @ (SL) \x1b[<Ps> A (SR)将屏幕内容左滚(SL)或右滚(SR)Ps 列 —— 与 CSI S / CSI T 对应的水平方向版本。
- DECSCA — 选择字符保护属性(CSI Ps " q)
\x1b[<Ps>"q把后续写入的单元标记为受 DECSED / DECSEL 保护(Ps=1)或不受保护(Ps=0 / 2)。
- DECSLRM — 设置左右边距(CSI Pl ; Pr s)
\x1b[<Pl>;<Pr>s把光标水平移动与滚动限制在列 Pl…Pr —— 与 DECSTBM 对应的水平方向版本。
- XTPUSHCOLORS / XTPOPCOLORS / XTREPORTCOLORS — 调色板栈(CSI # P / # Q / # R)
\x1b[#P (push) \x1b[#Q (pop) \x1b[#R (report)通过进程级栈保存 / 恢复 / 查询 xterm 的 ANSI 调色板 —— 适合需要临时修改调色板的 TUI。
- DECDC / DECIC — 删除 / 插入列(CSI Pn ' ~ / CSI Pn ' })
\x1b[<Pn>'~ (DECDC) \x1b[<Pn>'} (DECIC)在光标处删除(DECDC)或插入(DECIC)Pn 列 —— DL(CSI Pn M)与 IL(CSI Pn L)的列向版本。
- XTMODKEYS — 修改键盘上报模式(CSI > Pp ; Pv m)
\x1b[><Pp>;<Pv>m运行时切换 xterm 的 modifyKeyboard / modifyCursorKeys / modifyFunctionKeys / modifyOtherKeys 资源 —— 是 Ctrl+字母、Alt+字母 等键位精准上报的基础。
- XTSMTITLE / XTRMTITLE — 设置 / 重置标题显示模式(CSI > Ps ; … t / T)
\x1b[><Ps>;<Ps>…t (set) \x1b[><Ps>;<Ps>…T (reset)切换 xterm 解读 / 返回窗口标题与图标名称字符串的方式 —— 十六进制 vs UTF-8 编码、截断、设置 vs 查询行为。
- DECSWBV / DECSMBV — 设置警告 / 边距铃音量(CSI Ps SP t / CSI Ps SP u)
\x1b[<Ps> t (DECSWBV) \x1b[<Ps> u (DECSMBV)调整 C0 BEL(DECSWBV)与右边距警告铃(DECSMBV)的音量 —— 现代模拟器几乎一致忽略。
- SGR / urxvt 鼠标编码 — 鼠标上报的线缆格式(CSI M / CSI < / CSI)
\x1b[M<Cb><Cx><Cy> (legacy) \x1b[<<Cb>;<Cx>;<Cy>M|m (SGR ?1006) \x1b[<Cb>;<Cx>;<Cy>M (urxvt ?1015)终端上报鼠标事件的三种线缆格式:传统 CSI M Cb Cx Cy、现代 SGR ?1006、urxvt ?1015 —— DECSET ?100x 启用追踪后,输入流里到底出现什么。
- XTVERSION — 上报终端名称与版本(CSI > Pp q)
\x1b[>0q (query) reply: \x1bP>|<name> <version>\x1b\\向终端询问可读的名称 + 版本字符串 —— 替代 DECDA 用于功能检测的现代方案,已被 Helix、Zellij、Neovim 等采用。
- CSI ? Ps n — 私有 DSR(扩展状态查询)
\x1b[?<Ps>nDEC 私有设备状态报告 —— 扩展光标位置(?6 DECXCPR 含页号)、打印机 / UDK / 定位器 / 宏空间 / 内存校验和等状态。
- HPA / HPR / VPR — 绝对与相对定位(CSI ` / CSI a / CSI e)
\x1b[<col>` (HPA) \x1b[<n>a (HPR) \x1b[<n>e (VPR)ECMA-48 中保留行 / 列的光标移动 —— HPA(绝对列)、HPR(相对列)、VPR(相对行)—— 与 VPA 配套的完整四元。
- XTSMGRAPHICS — Sixel / ReGIS / 颜色寄存器容量查询 + 设置(CSI ? Pi ; Pa ; Pv S)
\x1b[?<Pi>;<Pa>;<Pv>S查询 / 设置终端的图形上限 —— sixel 颜色寄存器数、sixel 图形区域、ReGIS 图形区域。图像感知 TUI 决定位图大小的标准入口。
- DECSASD / DECSSDT — 状态显示路由与类型(CSI Ps $ } / CSI Ps $ ~)
\x1b[<Ps>$} (DECSASD) \x1b[<Ps>$~ (DECSSDT)选择后续输出写入哪个显示面(主屏 vs 状态行 —— DECSASD),以及状态行的用途(DECSSDT)—— DEC VT320 的分屏状态行。
- XTQMODKEYS — 查询 modifyKeys 当前取值(CSI ? Pp m)
\x1b[?<Pp>m向 xterm 查询当前 modifyKeyboard / modifyCursorKeys / modifyFunctionKeys / modifyOtherKeys 的取值 —— XTMODKEYS 的配套查询。
- XTPUSHSGR / XTPOPSGR / XTREPORTSGR — SGR 栈(CSI Ps + p / + q / + r)
\x1b[#{ (XTPUSHSGR, alt: CSI Pm + p) \x1b[#} (XTPOPSGR, alt: CSI + q) \x1b[+r (XTREPORTSGR)通过栈保存 / 恢复 / 查询当前 SGR 属性 —— XTPUSHCOLORS 在调色板栈外,对 SGR 属性的对应方案。
- DECSCPP — 选择每页列数(CSI Pn $ |)
\x1b[80$| (80 cols) \x1b[132$| (132 cols)把活动页面调整为 80 或 132 列 —— DECCOLM 用私有模式表达的同一行为,DECSCPP 是其参数化等价物。
- 副 DA 回复解码器 — `CSI > Pp ; Pv ; Pc c` 型号 / 固件 / 卡带
\x1b[>Pp;Pv;Pcc副 Device Attributes 回复的解码参考 —— 每个 Pp 型号码的含义,以及 kitty / wezterm / alacritty / iTerm2 / Ghostty 如何把自身版本编入 Pv。
- XTSAVE / XTRESTORE — 保存 / 恢复 DEC 私有模式(`CSI ? Pm s` / `CSI ? Pm r`)
\x1b[?<Pm>s (save) \x1b[?<Pm>r (restore)把一个或多个 DEC 私有模式状态压栈,稍后恢复 —— tmux / screen / fzf 用以安全地切换鼠标 / 备用屏 / 粘贴模式而不破坏用户设置的基础机制。
- DECSCL — 选择一致性级别(`CSI Pl ; Pc " p`)
\x1b[<Pl>;<Pc>" p选择 VT100 / VT200 / VT300 / VT400 / VT500 兼容级别 —— 控制终端识别哪个子集的转义序列,并决定 C1 以 7 位还是 8 位发送。隐式先执行硬重置(RIS)。
- DECSTR 副作用 —— `\x1b[!p` 究竟重置哪些模式
\x1b[!pDECSTR(软重置)会恢复到默认的每一个 DEC 模式 / 属性枚举参照 —— 哪些会被清、哪些保留、xterm / kitty / iTerm2 在哪里发生分歧。
- DECRPM 解码 —— 解析 DECRQM 回复(`CSI ? Ps ; Pm $ y`)
\x1b[?<Ps>;<Pm>$y (private) \x1b[<Ps>;<Pm>$y (ANSI)解析 DECRQM 回复 `CSI ? Ps ; Pm $ y`(以及 `CSI Ps ; Pm $ y`)—— `Pm` 数值说明该模式当前是 设置 / 重置 / 永久开 / 永久关 / 不识别 中的哪一种。
- DEC 定位器套件 —— DECELR / DECEFR / DECSLE / DECRQLP(鼠标 / 定位器事件)
\x1b[<Pn>;<Pu>'z \x1b[<Pm>'{ \x1b[<Pt>;<Pl>;<Pb>;<Pr>'w \x1b[<Ps>'|DEC 原版指点设备协议(比 xterm SGR 鼠标模式早十年)。四个序列分别 启用 / 过滤 / 选择 / 查询定位器事件;现代交互式 UI 改用 SGR 鼠标模式(`?1000` + `?1006`)。
- DECREQTPARM / DECREPTPARM —— 请求并报告终端参数(`CSI Ps x`)
\x1b[<Ps>xVT100 时代的遗留探测 —— 让终端报告其串口参数(校验、位宽、波特率、时钟倍数、标志位)。比 DA / DA2 / XTVERSION 都早;现今几乎不该再用,但 xterm 与多数现代模拟器仍以合成默认值作答。
- DECCARA / DECRARA —— 在矩形区域中改写 / 反转字符属性(`CSI Pt;Pl;Pb;Pr;Ps;… $ r` / `$ t`)
\x1b[<Pt>;<Pl>;<Pb>;<Pr>;<Ps>;…$r (DECCARA) \x1b[<Pt>;<Pl>;<Pb>;<Pr>;<Ps>;…$t (DECRARA)对一矩形区域内的字符仅改写或异或 SGR 属性,不改动字符本身 —— `dec-rect-ops` 中复制 / 填充 / 擦除三件套的「矩形属性」兄弟。
- DECPS —— 播放声音(`CSI Pv ; Pd ; Pn1 [; …] , ~`)
\x1b[<Pv>;<Pd>;<Pn1>[;<Pn2>…],~DEC VT520 音乐音播放 —— `Pv` 音量、`Pd` 时长、随后一个或多个 `Pn` 类 MIDI 音符号。冷门但 xterm、WezTerm、Ghostty、mlterm 都实现 —— 这是用 ANSI 让终端按指定音高响铃的唯一方式。
- DECTABSR —— 制表位报告(`CSI 2 $ w`)
\x1b[2$w让终端以 DCS 报告形式输出当前水平制表位。补全往返链:HTS(`esc-hts`)设置、TBC(`csi-tbc`)清除、DECTABSR 查询当前集合。
- DECRQCRA / DECCKSR —— 请求矩形区域校验和(`CSI Pi;Pg;Pt;Pl;Pb;Pr*y`)
\x1b[Pi;Pg;Pt;Pl;Pb;Pr*y reply \x1bP<Pi>!~<hex4>\x1b\\请终端对矩形区域的单元算 16 位校验和(`CSI Pi;Pg;Pt;Pl;Pb;Pr*y`),DCS DECCKSR 回(`\x1bP<Pi>!~<hex4>\x1b\\`)。xterm vttest / ConPTY 一致性测试用作金标。
- DECLL —— 加载 LED 灯(`CSI Ps q`,无 SP 中间字节)
\x1b[Ps q开关键盘前面板 L1–L4 LED(`CSI Ps q`)。在 Linux 控制台 terminfo 里以 `KEYBOARD_LED 1/2/3/4` 留存 —— 现代模拟器除 xterm + Linux console 外静默忽略。
- DECCRA / DECFRA / DECERA / DECSERA —— 矩形区域的复制 / 填充 / 擦除 / 选择性擦除
\x1b[<Pts>;<Pls>;<Pbs>;<Prs>;<Pps>;<Ptd>;<Pld>;<Ppd>$v DECCRA\n\x1b[<Pch>;<Pt>;<Pl>;<Pb>;<Pr>$x DECFRA\n\x1b[<Pt>;<Pl>;<Pb>;<Pr>$z DECERA\n\x1b[<Pt>;<Pl>;<Pb>;<Pr>${ DECSERADEC 矩形操作族里改字符内容的四件套 —— 复制一块、用某字模填、擦成空格、只擦未保护单元。与 DECCARA / DECRARA(改属性侧)以及 DECSACE(块 vs 流切换)配套。
- DECSACE —— 选择属性改写范围(`CSI Ps * x`)
\x1b[<Ps>*x切换 DECCARA / DECRARA 把矩形当作字面单元块(默认)还是从起点到终点的文本流。内容侧矩形操作(DECCRA / DECFRA / DECERA / DECSERA)不受影响。
- CSI Ps i —— 媒体复制(MC)—— 启用打印 / 关闭打印 / 打印行
\x1b[0i / \x1b[4i / \x1b[5i / \x1b[?4i / \x1b[?5iECMA-48 §8.3.82 控制,历史上把终端输出转给所连打印机。今日仍存于 xterm/mlterm 的「打印屏幕」钩子、IBM-3270 模拟器透传,以及私有模式 `CSI ? 4 / 5 i` 自动打印开关(被 `expect` 风格自动化使用)。
- DECRQDE / DECRPDE —— 请求 / 回报显示区范围(`CSI " v` / `" w`)
\x1b["v DECRQDE (request)\n\x1b[<Ph>;<Pw>;<Pml>;<Pmt>;<Pmp>"w DECRPDE (reply)VT420+ 的分页查询 —— 询问终端当前显示多少行 / 列,以及滚动窗口在页内存中的位置。让主机不必依赖 `tput lines / cols` 就能得知可视视口。