DECSTR side-effects — exactly which modes `\x1b[!p` resets
Reference enumeration of every DEC mode / attribute that DECSTR (soft reset) restores to its default — what gets cleared, what survives, and where xterm vs kitty vs iTerm2 diverge.
Byte forms
Every common string-literal form so you can paste-and-search either direction.
\x1b[!p\033[!p\e[!pESC [ ! p1b 5b 21 70Description
Companion reference to decstr-soft-reset — same byte sequence (\x1b[!p), expanded into the full side-effect manifest from DEC VT510 RM §8.4.1. Use this page when the question is 'will DECSTR clobber my X?' rather than 'how do I emit a soft reset?'.
DECSTR does NOT touch:
- screen contents (main or alt — survives)
- scrollback buffer (survives)
- alt-screen saved snapshot (survives)
- window title / icon name (set via OSC 0/2 — survives)
- character set definitions in G0..G3 (definitions survive; the active GL/GR pointers reset — see below)
- macro definitions (DECDMAC entries survive — see dcs-decdmac)
- user keys (DECUDK entries survive — see dcs-decudk)
- cursor position (preserved at the cell it was on)
DECSTR DOES reset, to the listed default:
- IRM (Insert / Replace mode, \x1b[4h/l) → Replace
- DECOM (Origin Mode, ?6h/l — see dec-origin-mode) → Off (absolute)
- DECAWM (Auto-Wrap Mode, ?7h/l — see dec-line-wrap) → On
- DECNRCM (National Replacement Char Mode, ?42h/l) → Off
- DECNKM (Numeric / Application Keypad — see deckpam-deckpnm) → Numeric
- KAM (Keyboard Action Mode, \x1b[2h/l) → Unlocked
- DECSCA (Select Character Protection — see decsca) → All chars unprotected
- DECSCNM (Screen Mode reverse video, ?5h/l — see decscnm) → Normal (off)
- DECTCEM (Text Cursor Enable, ?25h/l — see cursor-visibility) → On (cursor visible)
- DECCKM (Cursor Keys Mode, ?1h/l) → Normal
- DECRLM (Right-to-Left Mode, ?34h/l) → Off
- DECSCUSR (Cursor Shape — see dec-cursor-shape) → implementation default (usually blinking block, \x1b[0 q)
- DECSTBM (Top/Bottom Margins — see decstbm) → Full screen (rows 1 .. height)
- DECSLRM (Left/Right Margins — see decslrm) → Full screen (cols 1 .. width), only when DECLRMM is on
- SGR (all character attributes — colour, bold, italic, etc.) → Default (\x1b[0m)
- DECSC saved cursor state → Cleared (popped to empty)
- GL / GR mappings → GL → G0, GR → G2 (canonical defaults)
- Selective erase state → Disabled
Vendor divergence to know about when shipping DECSTR-emitting code:
- xterm, kitty, alacritty, wezterm, ghostty, konsole: match the spec table exactly.
- iTerm2: does not reset DECSCUSR — the cursor shape persists across \x1b[!p. If you need to also restore cursor shape, send \x1b[0 q explicitly after DECSTR.
- Windows Terminal: pre-1.20 builds do not reset DECSLRM. Modern builds match spec.
- Linux console (kernel vt): treats DECSTR as RIS-lite on older kernels — clears screen and scrollback too. Don't rely on scrollback survival.
- macOS Terminal: silently ignores the DECSCA reset (selective erase protection persists).
- cmd.exe / ConPTY: implements partially; SGR + DECTCEM reset, most others ignored.
When to reach for DECSTR vs RIS: DECSTR preserves user-visible screen + scrollback; RIS (see ris-reset) wipes them. For 'I just exited a TUI in unknown state — recover gracefully without losing context' → DECSTR. For 'user typed reset because their terminal is wedged' → RIS (which is what the reset shell command actually emits via terminfo rs1).
Defensive pattern when shipping a TUI that wants to leave the terminal pristine on exit: ``` startup: snapshot via DECRQSS what we care about (SGR, cursor shape, margins, mouse modes) exit (defer / signal handler): emit \x1b[!p # soft reset clears most state emit \x1b[0 q # force cursor shape (iTerm2 fallback) emit \x1b[?1l\x1b> # cursor keys + keypad normalised (extra safety) emit \x1b[?25h # cursor visible (paranoia — DECSTR already does this) ```
Spec citation: DEC VT510 RM §8.4.1 (DECSTR side-effect table) / xterm-ctlseqs
Examples
# Soft reset — preserves screen + scrollback. Side-effects as listed above.\nprintf '\\033[!p'# Probe DECSCUSR after DECSTR to verify cursor-shape reset (catches iTerm2).\nimport sys\nsys.stdout.write('\\x1b[!p\\x1bP$q q\\x1b\\\\')\nsys.stdout.flush()// Defensive exit: soft reset + explicit cursor shape + visible cursor.\nfunc restoreTerminal() {\n fmt.Print(\"\\x1b[!p\") // DECSTR\n fmt.Print(\"\\x1b[0 q\") // cursor shape -> default (iTerm2)\n fmt.Print(\"\\x1b[?25h\") // cursor visible (paranoia)\n}// On Node TUI exit, leave terminal pristine for the user's shell.\nprocess.on('exit', () => {\n process.stdout.write('\\x1b[!p\\x1b[0 q\\x1b[?25h');\n});/* DECSTR keeps screen but you may want to also clear scroll-region\n * since DECSTBM resets to full-screen. */\nprintf(\"\\x1b[!p\");\nprintf(\"\\x1b[H\"); /* cursor home — DECSTR leaves it where it was */\nfflush(stdout);Terminal support
- xterm
- yes
- Linux console (fbcon)
- partial
- macOS Terminal.app
- partial
- iTerm2
- partial
- Windows Terminal
- partial
- cmd.exe / ConPTY
- partial
- kitty
- yes
- alacritty
- yes
- WezTerm
- yes
- Ghostty
- yes
- GNOME Terminal
- yes
- Konsole
- yes
- tmux
- yes
- GNU screen
- yes
| xterm | Linux console (fbcon) | macOS Terminal.app | iTerm2 | Windows Terminal | cmd.exe / ConPTY | kitty | alacritty | WezTerm | Ghostty | GNOME Terminal | Konsole | tmux | GNU screen |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| yes | partial | partial | partial | partial | partial | yes | yes | yes | yes | yes | yes | yes | yes |
Related sequences
- DECSTR — Soft terminal reset
- RIS — Reset to Initial State (full terminal reset)
- DECSCA — Select character protection attribute (CSI Ps " q)
- DECSCUSR — Cursor shape
- DECSTBM — Set Top/Bottom Margins (CSI r)
- DECSLRM — Set left and right margins (CSI Pl ; Pr s)
- DECOM ?6 — Origin mode (clip cursor addressing to scroll region)
- DECKPAM / DECKPNM — Keypad application / numeric mode (ESC = / ESC >)