HPA / HPR / VPR — 绝对与相对定位(CSI ` / CSI a / CSI e)
ECMA-48 中保留行 / 列的光标移动 —— HPA(绝对列)、HPR(相对列)、VPR(相对行)—— 与 VPA 配套的完整四元。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x1b[<col>` (HPA) \x1b[<n>a (HPR) \x1b[<n>e (VPR)\033[10` / \033[5a / \033[3e\e[10` / \e[5a / \e[3eESC [ col ` / ESC [ n a / ESC [ n e1b 5b ... 60 / 1b 5b ... 61 / 1b 5b ... 65说明
三个 ECMA-48 光标定位原语,分别保留另一根轴 —— 形态与 VPA(\x1b[<row>d)、CHA(\x1b[<col>G,slug cursor-column)相同,填补了四元中的另一半。HPA(\x1b[<col> )水平位置绝对 —— 移到绝对列 <col>(从 1 起),保留当前行。语义等同 CHA(G),末字节有别仅因 ECMA-48 § 8.3.57(HPA)与 § 8.3.9(CHA)并列存在。**HPR**(\x1b[<n>a)水平位置相对 —— 右移 n 列,保留行。效果同 CUF(\x1b[<n>C),末字节 a 用以区分 ECMA-48 正统形式。**VPR**(\x1b[<n>e)垂直位置相对 —— 下移 n 行,保留列。同 CUD(\x1b[<n>B),仅末字节为 e。三者省略时默认 n=1 / col=1;超界数值被钳到可视区域(启用 DECSTBM / DECSLRM 时为对应区域)。实际上现代代码多用 CHA / CUF / CUD / CUB;但每个 ECMA-48 兼容终端都接受 HPA / HPR / VPR 别名,curses 默认能力表里就有它们,因此解析器必须识别这些末字节。HPA 的反引号 末字节是所有 CSI 末字节中最容易打错的 —— 注意它是 0x60,不是 0x27 的单引号(那是 DECIC / DECDC 的中间字节)。
规范出处: ECMA-48 §8.3.57 (HPA) / §8.3.59 (HPR) / §8.3.160 (VPR)
参数
| col / n | HPA:绝对列(从 1 起)。HPR:右移的列数。VPR:下移的行数。省略默认 1。 |
示例
printf '\033[40`status: ok' # HPA: jump to col 40, keep row (note backtick, not single quote)import sys; sys.stdout.write('\x1b[5a') # HPR: move 5 cols rightfmt.Print("\x1b[3e") // VPR: move 3 rows downprocess.stdout.write('\x1b[1`') // HPA: column 1 (== CR but doesn't move row)printf("\x1b[10a"); /* HPR: 10 cols right — same effect as \x1b[10C */终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 支持 | 支持 | 支持 | 支持 | 部分 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |