CSI Ps i — Media Copy (MC) — printer-on / printer-off / print line
ECMA-48 §8.3.82 control that historically routed terminal output to an attached printer. Survives today as the 'print screen' hook on xterm/mlterm, the IBM-3270 emulator pass-through, and as private-mode CSI ? 4 / 5 i auto-print toggles consumed by expect-style automation.
Byte forms
Every common string-literal form so you can paste-and-search either direction.
\x1b[0i / \x1b[4i / \x1b[5i / \x1b[?4i / \x1b[?5i\033[5i (printer-on) \033[4i (printer-off)\e[5i / \e[4iESC [ Ps i (Ps ∈ {0,1,4,5}) / ESC [ ? Ps i1b 5b 35 69 (printer-on) / 1b 5b 34 69 (printer-off)Description
Media Copy (MC) is the ECMA-48 mechanism for diverting terminal output to a secondary stream — historically an attached line printer or a serial-port-attached page printer. The standard parameters:
- \x1b[0i (or just \x1b[i) — print page. Send the current screen contents to the printer as a one-shot. The terminal handles framing (form-feed, page-end). xterm honours this by writing to the program named in the printerCommand X resource (typically lpr).
- \x1b[1i — print line. One-line variant of 0i.
- \x1b[4i — printer-off (Media Copy 'deselect'). Stop the stream-divert started by 5i. After this, output goes only to the screen.
- \x1b[5i — printer-on (Media Copy 'select'). Start diverting all subsequent terminal output to the printer until a matching 4i. Often called *transparent print mode*. The screen receives nothing in this state.
Private-prefix DEC variants (\x1b[?Ps i):
- \x1b[?1i — print cursor line (single line, no form-feed).
- \x1b[?4i — turn auto-print off.
- \x1b[?5i — turn auto-print on. Whenever the cursor advances past the right margin or a \n flushes a line, that line is also sent to the printer.
- \x1b[?10i / \x1b[?11i — print the composed display (VT300+); print every character including received controls.
Why it still matters in 2026
- IBM 3270 / 5250 emulator stacks (x3270, wc3270, tn5270) flow MC through the host application to a real or virtual LPT device. Older mainframe batch jobs still expect the \x1b[5i…\x1b[4i envelope to bracket print data.
- xterm + mlterm honour 0i and 5i/4i if printerCommand is set in the X resources — the modern equivalent is printerCommand: cat > /tmp/xterm.dump. Useful for screen capture / debugging without tmux capture-pane.
- expect scripts against legacy systems use \x1b[5i … \x1b[4i as a 'capture this block' marker because almost no modern emulator implements the divert, so the bytes are emitted to the screen and visible to expect's pattern matcher.
Coverage is mostly no-op today: xterm + mlterm = full (gated on printerCommand resource). Konsole = partial (parses, no-op without explicit printer support). Linux console = partial (5i / 4i work if lp daemon attached). WezTerm + Kitty + Alacritty + iTerm2 + gnome-terminal + Ghostty + Windows Terminal + cmd / ConPTY + macOS Terminal = silent no-op (the bytes pass through the parser without effect). Do not rely on the divert outside the xterm + mlterm + 3270 path.
Spec citation: ECMA-48 §8.3.82 (MC) / xterm-ctlseqs (CSI Ps i, CSI ? Ps i)
Parameters
| Ps = 0 | Print page — send current screen to printer (one-shot, with form-feed). |
| Ps = 1 | Print line — single-line variant. |
| Ps = 4 | Printer-off (deselect Media Copy stream). |
| Ps = 5 | Printer-on (select Media Copy stream — transparent print mode). |
| ? Ps = 1 | Print cursor line (DEC, single-line, no form-feed). |
| ? Ps = 4 / 5 | Auto-print off / on — each cursor line-wrap also goes to printer. |
Examples
# xterm with printerCommand='cat > /tmp/screen.dump' — capture current screen.\nprintf '\\033[0i'\n# Bracketed print: every byte between 5i and 4i goes to the printer.\nprintf '\\033[5i'; cat report.txt; printf '\\033[4i'import sys\n# expect-style capture marker — emits visible bytes on non-xterm.\nsys.stdout.write('\\x1b[5i')\nsys.stdout.flush()\n# (expect script greps for the literal bytes; xterm diverts them silently)// Auto-print every line as it scrolls (DEC private).\nfmt.Print(\"\\x1b[?5i\") // auto-print on\ndefer fmt.Print(\"\\x1b[?4i\") // auto-print off on exit// 3270 emulator print envelope around report data.\nprocess.stdout.write('\\x1b[5i' + reportData + '\\x1b[4i');/* Print cursor line, no form-feed. */\nprintf(\"\\x1b[?1i\");\nfflush(stdout);Terminal support
- xterm
- yes
- Linux console (fbcon)
- partial
- 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
- partial
- 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 | no | no | no | no | no | no | no | no | no | partial | yes | yes |