跳到主要内容
ansicode

DECNCSM —— 切列宽时不清屏(`CSI ? 95 h / l`)

抑制 DECCOLM(及 DECSCPP)切列宽时隐含的清屏副作用。DECNCSM 开启后,在 80 / 132 列之间切换会保留单元内容,而非清空。

字节形式

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

\\x1b[\x1b[?95h (set — preserve) \x1b[?95l (reset — clear)
\\033[\033[?95h
\\e[\e[?95h
ESC [ESC [ ? 9 5 h / ESC [ ? 9 5 l
hex1b 5b 3f 39 35 68 / 6c

说明

DECNCSM —— *切列宽时不清屏* —— 是控制 `deccolm`(DEC 132 列模式,`?3h/l`)与 `decscpp`(每页列数选择,`CSI Pn $|`)「切宽即清屏」副作用的修饰模式。 **关闭(默认,`\x1b[?95l`)** —— DECCOLM 与 DECSCPP 按历史规范运作:切 80 / 132 列时**清屏**、光标归位、DECSTBM 滚动区重置全屏、DECSLRM 左右边距重置。这是 VT100 硬件原始行为 —— CRT 无法重排文本,屏幕被擦掉。 **开启(`\x1b[?95h`)** —— DECCOLM / DECSCPP **保留**单元内容。新宽度外的单元被丢弃(或部分实现下隐藏到切回更宽列时再现)。DECSTBM 与 DECSLRM 仍重置;光标按新几何重定位。这是现代终端模拟器对希望「拉宽 / 缩窄不丢上下文」用户更友好的默认。 **为何存在** —— 需要历史 DECCOLM 行为(如 xterm 在 `allowC132` 模式下做 VT220 一致性测试)的程序必须清;想做响应式缩放(「用户切宽时保留缓冲」浏览器式语义)的现代程序则要保留。DECNCSM 把选择权交给应用代码。部分用户在 xterm 资源里永久打开(`*decTerminalID: vt320` + `*setColumnRequired: false`),让缩放体验更顺。 **与 `deccolm` / `decscpp` 的交互**: - `\x1b[?95l` + `\x1b[?3h` → 切到 132 列,**清屏**(历史)。 - `\x1b[?95h` + `\x1b[?3h` → 切到 132 列,**保留内容**。 - 同样适用于 `\x1b[80$|` / `\x1b[132$|`(DECSCPP)。 **重要的非作用**:DECNCSM 只抑制 *DECCOLM / DECSCPP 引起的清屏*。RIS(`\x1bc`)、DECSTR(`\x1b[!p`,见 `decstr-side-effects`)、显式 ED(`\x1b[2J`)仍照清不误。别把 DECNCSM 当通用「别清屏」开关 —— 它只作用于列宽切换。 **覆盖度**:**xterm** = 完整(标准实现)。**Kitty** / **WezTerm** / **Ghostty** = 完整。**iTerm2** = 完整。**Konsole** = 完整。**Windows Terminal** = 部分(DECCOLM 本身受配置控制,启用后 1.18+ 起 DECNCSM 起效)。**Alacritty** = 实际无作用(DECCOLM 自身就是 no-op,DECNCSM 无东西可门控)。**Linux console** / **macOS Terminal** / **cmd / ConPTY** / **gnome-terminal** = 无作用。 **查询**:`\x1b[?95$p`(DECRQM,见 `decrqm` / `decrpm-decoder`)—— 设置时回 `\x1b[?95;1$y`,重置时回 `\x1b[?95;2$y`。

规范出处: DEC VT510 RM (DECNCSM) / xterm-ctlseqs (CSI ? 95 h / l)

示例

bash
# Enable preserve-on-resize, then switch to 132 columns without losing buffer.\nprintf '\\033[?95h'   # DECNCSM set — no clear on column-mode change\nprintf '\\033[?3h'    # DECCOLM 132 col (with DECNCSM, contents survive)
python
import sys\nsys.stdout.write('\\x1b[?95h')      # don't clear on column toggle\nsys.stdout.write('\\x1b[132$|')      # DECSCPP to 132 cols, preserving buffer\nsys.stdout.flush()
go
// Persist DECNCSM at startup, restore at exit.\nfmt.Print(\"\\x1b[?95s\")             // XTSAVE — push current value\nfmt.Print(\"\\x1b[?95h\")             // enable preserve\ndefer fmt.Print(\"\\x1b[?95r\")       // XTRESTORE on exit
javascript
// Probe DECNCSM state before deciding whether to defensively redraw on resize.\nprocess.stdout.write('\\x1b[?95$p');\n// expect reply \\x1b[?95;1$y (set) or ?95;2$y (reset)
c
/* Disable preserve (restore historical clear-on-DECCOLM). */\nprintf(\"\\x1b[?95l\");

终端支持

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

相关序列