跳到主要内容
ansicode

DECSTR — 软终端重置

将 DEC 私有模式与 SGR 重置为默认,但不清屏,也不清回滚缓冲。

字节形式

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

\\x1b[\x1b[!p
\\033[\033[!p
\\e[\e[!p
ESC [ESC [ ! p
hex1b 5b 21 70

说明

DEC 软终端重置(DECSTR)。标准 CSI 序列,末字节 p(0x70)前有中间字节 !(0x21):\x1b[!p。xterm-ctlseqs §DECSTR 列出精确的重置集 —— SGR(颜色 + 加粗 + 斜体 + 下划线 + 反显 + 闪烁 + 删除线)、DECAWM 自动换行(?7)、DECOM 原点模式(?6)、IRM 插入 / 替换模式、键盘应用 / 光标键模式、字符集 G0–G3、DECSTBM 滚动区域(顶 = 1,底 = 可视高度)、DECSCUSR 光标样式(恢复用户默认)以及若干其他 DEC 私有模式。它明确 *不* 清屏、*不* 触及回滚缓冲、*不* 退出备用屏幕 —— 这就是「软」重置的本意,是 RIS 的精准互补。

可移植性 —— xterm、iTerm2、kitty、alacritty、wezterm、gnome-terminal、Konsole、Ghostty、Linux console、Windows Terminal、ConPTY 1809+ 全部通用。Windows 旧 cmd.exe(ConPTY 之前)完全忽略 DECSTR。典型恢复场景:vimhtop 在反显激活、自动换行关闭、滚动区域被限制在 5–20 行、光标隐藏、DECSCUSR 设为实心竖线的状态下崩溃。\x1b[!p 一次往返就把上述每个私有模式还原为默认 —— 且不丢失用户可能想回看的回滚。对比 RIS(\x1bc,见 ris-reset)—— 它做同样的重置 *外加* 清屏、清回滚、在 Linux console 上重新初始化整个终端状态(字体表、调色板)—— DECSTR 不够用时的更重锤子,但对用户可能仍需要的回滚是破坏性的。

规划恢复脚本时要留意「漏网名单」:DECSTR *不* 清屏(如需另发 \x1b[2J\x1b[H)、*不* 退出备用屏幕(用 \x1b[?1049l,见 alt-screen),且在部分 xterm 构建中 *不* 撤销 DECSET ?1000 / ?1006 鼠标追踪、?2004 括号粘贴、?1004 焦点事件 —— xterm 跨版本矩阵不一,kitty / wezterm 比 xterm 重置更多私有模式。在 TUI 崩溃后做完整清理的可持久 shell 提示符配方:printf '\x1b[?1049l\x1b[?1000l\x1b[?1006l\x1b[?2004l\x1b[?1004l\x1b[!p\x1b[?25h' —— 先逐一 DECRST 容易泄漏的私有模式、再 DECSTR 处理其余、最后显式显示光标。部分 shell 提供内建命令(fish 的 reset-ttystty sane 涵盖内核侧但不涵盖终端发射端)。相关:ris-reset(RIS \x1bc —— 硬重置,清回滚)、sgr-reset(SGR 0 —— 仅颜色 / 属性重置,最轻锤)、alt-screen(DECSET ?1049 —— 须与 DECSTR 分开关闭)。

规范出处: xterm-ctlseqs (DECSTR, CSI ! p)

示例

bash
printf '\033[!p'   # soft reset; scrollback preserved
python
import sys; sys.stdout.write('\x1b[!p')
go
fmt.Print("\x1b[!p")
javascript
process.stdout.write('\x1b[!p')
c
printf("\x1b[!p");

常见问题

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

DECSTR(\x1b[!p)与 RIS(\x1bc)有何区别?
DECSTR 是复位——清 SGR 状态、光标保存槽、DEC 私有模式、滚动区域、原点模式、字符集,但保留屏幕内容与滚动历史。RIS 是复位——做 DECSTR 的一切,外加清屏、重置 Tab 位、多数终端还会重置调色板。撤销 TUI 的模式改动而不丢用户历史用 DECSTR;模拟完整上电状态才用 RIS。

终端支持

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

相关序列

在家族食谱中

ESC 食谱 · 1. 硬复位 vs. 软复位 —— `\x1bc`(RIS)与 `\x1b[!p`(DECSTR)