跳到主要内容
ansicode

CUU / CUD / CUF / CUB — 移动光标

将光标向上 / 下 / 右 / 左 移动 N 格。

字节形式

涵盖所有常见的字符串字面量写法,方便正反查找。

\\x1b[\x1b[NA (up; B down, C right, D left)
\\033[\033[1A
\\e[\e[1A
ESC [ESC [ N A
hex1b 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 格

示例

bash
printf 'line1\nline2\033[1A\rCHANGED\033[1B\r\n'
python
import sys; sys.stdout.write('\x1b[2A')
go
fmt.Print("\x1b[2A")
javascript
process.stdout.write('\x1b[2A')
c
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
支持

相关序列

在家族食谱中

CSI 食谱 · 2. 光标移动 —— CUU / CUD / CUF / CUB + CUP + CHA / VPA