CUU / CUD / CUF / CUB — 移动光标
将光标向上 / 下 / 右 / 左 移动 N 格。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x1b[NA (up; B down, C right, D left)\033[1A\e[1AESC [ N A1b 5b <N> 41说明
四个方向的光标移动序列共用 \x1b[NX 形态,由末字节区分:A=CUU 上、B=CUD 下、C=CUF 前进 / 右、D=CUB 后退 / 左。N 是移动格数,省略时默认 1(\x1b[A 上移一行,等价于 \x1b[1A)—— 应用 ECMA-48 「省略参数 = 默认 1」的契约。csi-default-params 这条 pitfall 说明了为何不要发 \x1b[0A(0 未标准化:xterm 钳到 1,Linux console / fbcon 视为空操作,Apple Terminal.app 直接丢弃)。光标在可寻址区域边缘停下 —— CUU / CUD 不滚动视口,CUF / CUB 不换行。需要滚动用 scroll-up-down(SU / SD);需要绝对定位用 cursor-position(CUP)。
可寻址边界由滚动区域决定。如果 DECSTBM 用 \x1b[t;br 缩小了滚动区域,CUU 在第 t 行停而非第 1 行;除非 DECOM(?6h)激活,CUF / CUB 分别在最右 / 最左屏幕列停下;DECOM 激活时改以滚动区域原点为参考。Linux console / fbcon 正确实现了四个方向;ConPTY 1809+ 把它们透传到宿主终端;tmux 原样转发;screen 4.x 与 5.0 都处理。对应的 terminfo cap 是单格的 cuu1 / cud1 / cuf1 / cub1 和带参数的 cuu / cud / cuf / cub —— tput cuu1 是不假定 xterm-256color 的可移植 shell 写法。
它们没有「关闭」语义 —— 是无状态的光标移动而非切换。原地进度重绘的常用习语是 \r\x1b[K(回车 + EL 擦到行尾,见 erase-line),不是用 CUB 回到列 1 —— CUB N 会让新光标位置右侧已写的字符留在原处。多行进度显示用 \x1b[NA 上移、重绘、再 \x1b[NB(或隐式换行)返回。如果 TUI 需要在重绘中途仍精准的绝对定位,cursor-position(CUP \x1b[r;cH)比链式相对移动更可靠 —— 终端侧状态在你 CUU 与后续 CUF 之间发生 reflow / resize 时可能漂移。
规范出处: ECMA-48 §8.3.22 (CUU) / §8.3.19 (CUD) / §8.3.20 (CUF) / §8.3.18 (CUB)
参数
| A | 向上 N 格 |
| B | 向下 N 格 |
| C | 向右 N 格 |
| D | 向左 N 格 |
示例
printf 'line1\nline2\033[1A\rCHANGED\033[1B\r\n'import sys; sys.stdout.write('\x1b[2A')fmt.Print("\x1b[2A")process.stdout.write('\x1b[2A')printf("\x1b[2A");在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- bash, zsh readline在输入缓冲区内左右移动光标
- vim, neovim在传统终端上 `h j k l` 等移动命令通过 CUU/CUD/CUF/CUB 重绘
- ora, cli-spinners用 CUU 回到旋转帧之前再重绘
- htop, btop in-place stat redraws
- tmux pane scrolling
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
\x1b[A是上移 0 行还是上移 1 行?- 上移 1 行。省略的 CSI 光标移动参数默认是 1,不是 0(CUU / CUD / CUF / CUB / CHA / VPA 都是这样)。所以
\x1b[A等价于\x1b[1A,\x1b[5A上移 5 行。从 CUP 过来的人容易踩这个坑——CUP 省略参数也默认 1,但语义是「回家」不是「不动」。参见csi-default-params误区条目。 - 为什么
\x1b[B(下移)到屏幕底就不动了? - 光标移动序列会夹到可见区域——它们不会触发滚动。要在底边上让内容向上滚一行,用
\x1b[S(SU,向上滚)或\x1b[M(RI,反向索引在顶部向下滚)。在最后一行发\x1b[B是空操作;光标不动。CUF 超出右边界同理。
终端支持
- xterm
- 支持
- Linux console (fbcon)
- 支持
- macOS Terminal.app
- 支持
- iTerm2
- 支持
- Windows Terminal
- 支持
- cmd.exe / ConPTY
- 支持
- kitty
- 支持
- alacritty
- 支持
- WezTerm
- 支持
- Ghostty
- 支持
- GNOME Terminal
- 支持
- Konsole
- 支持
- tmux
- 支持
- GNU screen
- 支持
| xterm | Linux console (fbcon) | macOS Terminal.app | iTerm2 | Windows Terminal | cmd.exe / ConPTY | kitty | alacritty | WezTerm | Ghostty | GNOME Terminal | Konsole | tmux | GNU screen |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |