CRM Control Representation Mode
Show control characters as graphic symbols instead of performing them.
CSI 3 h/l
- ECMA-48
- §7.2.2 CRM – Control Representation Mode, p. 22
- VT220
- §2.7 Display Controls Mode
- VT510
- CRM—Show Control Character Mode
Mode 3 turns the terminal into a display of what it receives. Set, control functions are shown as graphic symbols rather than performed; reset, which is the default, they are performed.
| State | ECMA-48 calls it | Meaning |
|---|---|---|
Reset, CSI 3 l | CONTROL | control functions are performed |
Set, CSI 3 h | GRAPHIC | control functions, except RM, are shown as graphic characters |
RM is the exception so that CSI 3 l can still turn the mode off.
DEC terminals call it Show Control Character Mode. The VT510 manual describes CRM with a special font for the controls: every control is shown, and only LF, FF and VT are also performed, as a new line. The VT510 lets the host set it with CSI 3 h. The VT220 did not: its manual (§2.7) calls it display controls mode, selected only in Set-Up, and says no escape sequence turns it on. DEC STD 070 does not list it among the modes a host can set either.
xterm has no such mode. ansi_modes ignores CSI 3 h, and controls keep working afterwards. DECRQM reports it as reset, 2, rather than as permanently reset (do_ansi_rqm), which says it is a mode xterm knows. libghostty-vt ignores CSI 3 h as well, but does not recognize the number, and answers 0. So the DECRQM cases are known differences, and the case showing that the controls still work is not.
Support
| Terminal | Version | Support | Notes |
|---|---|---|---|
| VT220 | manual, 2nd ed., 1984 | No | display controls mode, but only from Set-Up (§2.7) |
| VT510 | manual, 1st ed., 1993 | Yes | CRM |
| xterm | patch 412, xterm-411a | No | ignored; DECRQM reports it reset, 2 |
| libghostty-vt | 0f171f6 | No | ignored; DECRQM answers 0 (CRM-1, CRM-2) |
| ConEmu | build 230724, its documentation | No | not in its ANSI escape codes |
Validation
CRM-1: Reported as reset
\e[3$p
|_____|
reply \e[3;2$y
CRM-2: Even after it is set
\e[3h
\e[3$p
|_____|
reply \e[3;2$y
CRM-3: Controls are still performed
\e[3h # ignored
AB
\r
C
|CB___|
cursor 1,2