跳到主要内容
ansicode

DECSET ?1047 — 仅切换备用屏(不保存光标)

切换备用屏但不保存光标 —— 比 ?1049 更原始的形式。

字节形式

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

\\x1b[\x1b[?1047h (enter alt) \x1b[?1047l (leave alt)
\\033[\033[?1047h / \033[?1047l
\\e[\e[?1047h / \e[?1047l
ESC [ESC [ ? 1 0 4 7 h / l
hex1b 5b 3f 31 30 34 37 68 / 6c

说明

alt-screen 共有三种私有模式 —— ?47?1047?1049?1047 仅切换备用屏,不保存/恢复光标;?1048 仅保存/恢复光标(不切屏);?1049 是现代复合形式:保存光标 + 进入 alt + 清屏;退出时还原 alt → 主屏 + 恢复光标。完全不关心光标位置的程序(动画玩具、简单状态栏工具)可用 ?1047 节省字节;既要切屏又要保留光标的程序(vim、less、tmux、htop)应直接发送 ?1049,而非底层 pair。注意:通过 ?1047l 离开备用屏时 xterm 还会在翻屏前清掉主屏,会令期待无损翻屏的程序意外。

规范出处: xterm-ctlseqs (Private mode 1047)

示例

bash
printf '\033[?1047h'   # switch to alt; cursor position NOT saved\nprintf '\033[?1047l'   # back to main; main screen is cleared first
python
import sys; sys.stdout.write('\x1b[?1047h')
go
fmt.Print("\x1b[?1047h")
javascript
process.stdout.write('\x1b[?1047h')
c
printf("\x1b[?1047h");

常见问题

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

什么时候用 ?1047 而不是 ?1049?
几乎从不 —— 现代 TUI 都该用 ?1049。?1049 是*原子的*:在一次操作中保存光标(DECSC)、切换到 alt 缓冲、清空 alt 缓冲;?1049l 倒序撤销三件事。?1047 只做缓冲切换 —— 不保存光标、不清屏 —— 所以要自己按正确顺序发 \x1b7(DECSC)和 \x1b[2J(或 \x1b[3J 清回滚),退出时配对清理。如今选 ?1047 的唯一理由是目标终端的 ?1049 实现破损(现代矩阵中无此情况)—— 即便如此,?1047 + 显式 DECSC + 清屏也只是用更多字节、更大故障面换 ?1049 行为。
?1047 进入 / 退出 alt-screen 时会保留回滚吗?
会 —— ?1047 在进出之间保持*主*缓冲的回滚原状。alt 缓冲本身无回滚(它是固定大小的屏幕形缓冲,无历史)。?1047l 退出时,主缓冲 ?1047h 前的回滚原样回到位;alt 缓冲内容被丢弃。需要干净的 alt 画布时,在 alt 侧 ?1047h 前发 \x1b[3J(ED 3 —— 清回滚),或干脆用 ?1049 在同一原子操作里搞定清屏。

终端支持

xterm
支持
Linux console (fbcon)
不支持
macOS Terminal.app
支持
iTerm2
支持
Windows Terminal
支持
cmd.exe / ConPTY
部分
kitty
支持
alacritty
支持
WezTerm
支持
Ghostty
支持
GNOME Terminal
支持
Konsole
支持
tmux
支持
GNU screen
支持

相关序列

在家族食谱中

DEC 食谱 · 2. 备用屏 —— `\x1b[?1049h` / `l`