Skip to main content
ansicode

DECSASD / DECSSDT — Status display routing & type (CSI Ps $ } / CSI Ps $ ~)

Pick which display surface (main vs status line) receives subsequent output (DECSASD), and what the status line is for (DECSSDT) — DEC VT320's split-screen status row.

Byte forms

Every common string-literal form so you can paste-and-search either direction.

\\x1b[\x1b[<Ps>$} (DECSASD) \x1b[<Ps>$~ (DECSSDT)
\\033[\033[1$} / \033[2$~
\\e[\e[1$} / \e[2$~
ESC [ESC [ Ps $ } / ESC [ Ps $ ~
hex1b 5b ... 24 7d / 1b 5b ... 24 7e

Description

Two paired commands governing DEC VT320's 25th-row status line — a hardware-supported strip below the main 24-row display that holds OS status, hostname, or terminal-emulator chrome. **DECSASD** (`\x1b[<Ps>$}`) Select Active Status Display — pick which surface subsequent writes land on. `Ps=0` selects the main display (default), `Ps=1` selects the status line. After `\x1b[1$}`, cursor moves and writes target row 25 only; switch back with `\x1b[0$}` to resume normal output. **DECSSDT** (`\x1b[<Ps>$~`) Set Status Display Type — configures what the status line is for. `Ps=0` no status line (row 25 returns to main display), `Ps=1` indicator (terminal owns the row — shows online/offline, keyboard lock state), `Ps=2` host-writable (application owns the row via DECSASD — the useful mode for vim-style ruler / curses status bars). Most modern emulators don't allocate a dedicated row — they treat row 25 as just another row of the main grid, making DECSASD a near-no-op (cursor jumps to row 25 but no virtual-screen split happens) and DECSSDT essentially ignored. The functional escape sequences are still recognized for VT compatibility but provide no semantic separation. Curses captures these as `tsl` (to status line) and `fsl` (from status line) entries in modern terminfo, mapping them to `\x1b[1$}` and `\x1b[0$}` respectively.

Spec citation: DEC VT520 RM (DECSASD / DECSSDT)

Parameters

Ps (DECSASD)Active display: `0` main, `1` status line.
Ps (DECSSDT)Status display type: `0` none, `1` indicator (terminal-owned), `2` host-writable.

Examples

bash
# Reserve status line, write to it, return to main:\nprintf '\033[2$~'           # DECSSDT: host-writable status\nprintf '\033[1$}'           # DECSASD: target status\nprintf 'session: alice@host'\nprintf '\033[0$}'           # DECSASD: back to main
python
import sys\nsys.stdout.write('\x1b[2$~')   # enable host-writable status line
go
fmt.Print("\x1b[1$}")   // following writes go to row 25\nfmt.Print("loading...")\nfmt.Print("\x1b[0$}") // back to main
javascript
process.stdout.write('\x1b[0$~')   // disable status line (return row 25 to main)
c
printf("\x1b[2$~\x1b[1$}");   /* enable status + select it */

Terminal support

xterm
partial
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
no
Konsole
no
tmux
no
GNU screen
no

Related sequences