CSI Ps i —— 媒体复制(MC)—— 启用打印 / 关闭打印 / 打印行
ECMA-48 §8.3.82 控制,历史上把终端输出转给所连打印机。今日仍存于 xterm/mlterm 的「打印屏幕」钩子、IBM-3270 模拟器透传,以及私有模式 CSI ? 4 / 5 i 自动打印开关(被 expect 风格自动化使用)。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\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)说明
Media Copy(MC)是 ECMA-48 把终端输出分流到次级流的机制 —— 历史上是所连的行式打印机或串口纸式打印机。标准参数:
- \x1b[0i(或单写 \x1b[i)—— 打印当前页。把当前屏内容作为一次性向打印机发送,由终端处理分页(换页、页尾)。xterm 通过 X 资源 printerCommand 指定的程序(通常是 lpr)执行。
- \x1b[1i —— 打印当前行。0i 的单行版。
- \x1b[4i —— 关闭打印(Media Copy 'deselect')。停止 5i 启动的流分发。其后输出仅去屏幕。
- \x1b[5i —— 开启打印(Media Copy 'select')。开始把后续所有终端输出分发到打印机,直至匹配的 4i。常称*透明打印模式*。此期间屏幕无输出。
DEC 私有前缀变体(\x1b[?Ps i):
- \x1b[?1i —— 打印光标所在行(单行,无换页)。
- \x1b[?4i —— 关 自动打印。
- \x1b[?5i —— 开 自动打印。每当光标越过右边距或 \n 触发换行时,该行也被发到打印机。
- \x1b[?10i / \x1b[?11i —— 打印合成显示(VT300+);打印所有字符包括收到的控制。
2026 年为什么仍要紧
- IBM 3270 / 5250 模拟器栈(x3270、wc3270、tn5270)让 MC 透过宿主应用到达真实或虚拟 LPT 设备。老旧主机批处理仍预期 \x1b[5i…\x1b[4i 包裹打印数据。
- xterm + mlterm 在 X 资源设置了 printerCommand 时尊重 0i 与 5i/4i —— 现代等价为 printerCommand: cat > /tmp/xterm.dump。可用作屏幕捕获 / 调试而无需 tmux capture-pane。
- expect 对老系统跑脚本时用 \x1b[5i … \x1b[4i 作「捕获此块」标记,因为几乎没现代模拟器实现分发,字节会原样送到屏幕、被 expect 的模式匹配器看到。
覆盖度今日多为静默:xterm + mlterm = 完整(受 printerCommand 资源约束)。Konsole = 部分(解析,未显式接打印机时静默)。Linux console = 部分(连了 lp 守护时 5i / 4i 工作)。WezTerm + Kitty + Alacritty + iTerm2 + gnome-terminal + Ghostty + Windows Terminal + cmd / ConPTY + macOS Terminal = 静默(字节穿过解析器不生效)。除了 xterm + mlterm + 3270 路径外,不要依赖分发。
规范出处: ECMA-48 §8.3.82 (MC) / xterm-ctlseqs (CSI Ps i, CSI ? Ps i)
参数
| Ps = 0 | 打印当前页 —— 把当前屏发到打印机(一次性,含换页)。 |
| Ps = 1 | 打印当前行 —— 单行变体。 |
| Ps = 4 | 关闭打印(取消选择 Media Copy 流)。 |
| Ps = 5 | 开启打印(选择 Media Copy 流 —— 透明打印模式)。 |
| ? Ps = 1 | 打印光标所在行(DEC,单行,无换页)。 |
| ? Ps = 4 / 5 | 自动打印 关 / 开 —— 每次光标换行也送给打印机。 |
示例
# 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);终端支持
- xterm
- 支持
- Linux console (fbcon)
- 部分
- macOS Terminal.app
- 不支持
- iTerm2
- 不支持
- Windows Terminal
- 不支持
- cmd.exe / ConPTY
- 不支持
- kitty
- 不支持
- alacritty
- 不支持
- WezTerm
- 不支持
- Ghostty
- 不支持
- GNOME Terminal
- 不支持
- Konsole
- 部分
- tmux
- 支持
- GNU screen
- 支持
| xterm | Linux console (fbcon) | macOS Terminal.app | iTerm2 | Windows Terminal | cmd.exe / ConPTY | kitty | alacritty | WezTerm | Ghostty | GNOME Terminal | Konsole | tmux | GNU screen |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 部分 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 部分 | 支持 | 支持 |