跳到主要内容
ansicode

VPA — 垂直行绝对定位(CSI d)

将光标移动到绝对行,保持当前列不变。

字节形式

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

\\x1b[\x1b[<row>d
\\033[\033[3d
\\e[\e[3d
ESC [ESC [ row d
hex1b 5b ... 64

说明

Vertical Position Absolute。把光标移到第 <row> 行(从 1 开始),不改变列 —— 是 CHA(\x1b[<col>G,cursor-column)的行版对照。省略时默认 row=1(\x1b[d)。超界数值被钳制到可视区域(启用 DECOM 时为 DECSTBM 滚动区域)。VPA 的「保留列」行为使其成为在已知行重绘状态栏 / 进度行的正确原语,而用户继续在上方列输入 —— CUP(\x1b[r;cH)则会把列重置为 1。日常 TUI 多用绝对 (row, col) 二元组,因此使用频率不如 CUP / CUU / CUD,但每个 ECMA-48 兼容终端都支持它。

规范出处: ECMA-48 §8.3.158 (VPA) / xterm-ctlseqs

示例

bash
printf '\033[24dstatus: ok'   # jump to row 24, keep column
python
import sys; sys.stdout.write('\x1b[24dstatus: ok')
go
fmt.Print("\x1b[24dstatus: ok")
javascript
process.stdout.write('\x1b[24dstatus: ok')
c
printf("\x1b[24dstatus: ok");

在哪里用到

实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。

  • vim / neovim status line redraw`:redrawstatus` 与每窗口的 `&statusline` 重绘路径用 VPA 跳到状态行,同时保留光标当前列 —— 省去 CUP `\x1b[<row>;<col>H` 来回切换和缓冲区光标处于行中时的额外列运算
  • htop / btop / glances column-aligned rows在写入页眉 / 页脚最左列后,htop 发 VPA 跳到下一行同一列,而不必为每行重算列 —— 列恒定正是 htop 纵向条柱在 SIGWINCH 重绘下仍干净渲染的关键
  • ncurses `wmove(WIN, row, col)` when column unchangedncurses 的差分渲染器在脏行追踪指示列与上次光标列一致时发 VPA `\x1b[<row>d` 而非 CUP —— 每次重绘省 1-2 字节,在慢速远程 PTY 上累计显著
  • less status-line repaintless 通过 VPA 跳到底行 + EL `\x1b[K`(清行)+ 写入来重绘 `:` 提示符 —— 上次换行后列已为 0,因此用 VPA 即可,不必 CUP
  • tmux pane-status-format updatestmux 每窗格状态行更新(`set -g pane-status-format`)发 VPA 落到窗格视口内的状态行 —— `\x1b[<row>d` 在窗格做水平分割且列原点不同时仍能干净通过每窗格转换

常见问题

针对这条序列,开发者真正会去搜索的问题的简短回答。

\x1b[<n>d(VPA)与 \x1b[<n>;<col>H(CUP)有何不同?
VPA(\x1b[Pn d)把光标设为第 Pn 行,*同时保留当前列*。CUP(\x1b[Pn1;Pn2 H)同时设置行与列。绘制纵向侧边栏 / 滚动条 / 列对齐状态指示时,VPA 让你逐行下移而不必每行重算列。两者行号均按 ECMA-48 从 1 起计;\x1b[1d 到第 1 行。需要在屏边夹紧时,终端会代为处理(多数夹紧到第 1 行 / 第 LINES 行)。
\x1b[<n>d(VPA)是从 0 起还是从 1 起?
从 1 起,与 CUP 一致。\x1b[1d 是第 1 行;\x1b[0d *不*是第 1 行 —— Pn=0 按 ECMA-48 被视作 Pn=1(多数终端静默夹紧;少数遗留解析器直接拒收)。省略 Pn 同样默认为 1:\x1b[d 等同 \x1b[1d。CUP / HVP / CHA 上同样的陷阱见 cup-1-based-not-0-based 误区条目。

终端支持

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