DECSCPP — Select columns per page (CSI Pn $ |)
Resize the active page to 80 or 132 columns — the data-side request that DECCOLM expresses as a private mode toggle.
Byte forms
Every common string-literal form so you can paste-and-search either direction.
\x1b[80$| (80 cols) \x1b[132$| (132 cols)\033[80$| / \033[132$|\e[80$| / \e[132$|ESC [ Pn $ |1b 5b 38 30 24 7c / 1b 5b 31 33 32 24 7cDescription
Set Columns Per Page. DEC VT400 / VT520 sequence with intermediate byte `$` (0x24) and final `|` (0x7c). `Pn=80` (or omitted) requests 80-column mode; `Pn=132` requests 132-column mode. Any other value is silently ignored. **DECSCPP is the parameterised cousin of DECCOLM** (`\x1b[?3h/l`, slug `deccolm`): both ultimately ask the terminal to change page width, but DECCOLM is a fixed two-state toggle while DECSCPP carries an explicit column count. The two share these implementation-defined side effects: - The screen is **cleared** (filled with spaces using the current SGR background). - The cursor is **homed** to row 1 / column 1. - Scrolling region (DECSTBM) and horizontal margins (DECSLRM) are **reset** to full-page. These side effects are the historical reason `resize`-aware programs send DECCOLM/DECSCPP only at terminal-init time and never inside a TUI render loop — flipping width nukes the visible buffer. Modern emulators almost universally honour DECSCPP only when DECCOLM is also enabled at config time (xterm's `allowC132` / `c132` resources, gnome-terminal's allowAlternateScreen). When disabled, the sequence is silent-ignored — the same conservative posture as DECCOLM. The intermediate-byte trap: `CSI Pn |` (no `$`) is **DECTABSR / DECTSR depending on context**, not DECSCPP — the `$` distinguishes the column-set sequence from the tab-stop / status-report family.
Spec citation: DEC VT400 (DECSCPP) / xterm-ctlseqs
Parameters
| Pn | Column count. `80` (or omitted) selects 80-column mode; `132` selects 132-column mode. Other values are ignored. |
Examples
# Request 132-column wide mode for a log dump:\nprintf '\033[132$|' # screen clears, cursor homes\ncat very-wide-output.log\nprintf '\033[80$|' # restore 80-col on exitimport sys\nsys.stdout.write('\x1b[132$|') # widen\ntry:\n render_wide_table()\nfinally:\n sys.stdout.write('\x1b[80$|')fmt.Print("\x1b[132$|") // wide\ndefer fmt.Print("\x1b[80$|") // narrow backprocess.stdout.write('\x1b[132$|')\nprocess.on('exit', () => process.stdout.write('\x1b[80$|'))printf("\x1b[132$|"); /* 132 cols — clears screen, homes cursor */\nprintf("\x1b[80$|"); /* back to 80 */Terminal support
- xterm
- yes
- Linux console (fbcon)
- no
- macOS Terminal.app
- no
- iTerm2
- no
- Windows Terminal
- no
- cmd.exe / ConPTY
- no
- kitty
- no
- alacritty
- no
- WezTerm
- no
- Ghostty
- no
- GNOME Terminal
- partial
- Konsole
- partial
- tmux
- no
- GNU screen
- no
| xterm | Linux console (fbcon) | macOS Terminal.app | iTerm2 | Windows Terminal | cmd.exe / ConPTY | kitty | alacritty | WezTerm | Ghostty | GNOME Terminal | Konsole | tmux | GNU screen |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| yes | no | no | no | no | no | no | no | no | no | partial | partial | no | no |