Skip to content

modifyOtherKeys mode 3

Category: input · Baseline: rich · Tags: Xterm Extensions · Specification ↗

xterm's modifyOtherKeys mode 3 (patch 398, April 2025) makes ALL keyboard input — including unmodified keys — send escape sequences. Mode 2 only affects modified keys (Ctrl+X, Alt+X), while mode 3 extends this to every keypress. The sequence is CSI > 4 ; 3 m. Mode 3 also extends modifier encoding to cursor-keys, function-keys, keypad-keys, modifier-keys, and special-keys, with subparameters in XTMODKEYS for selective modifier masking. This provides applications with unambiguous key identification similar to the kitty keyboard protocol, but using xterm's native encoding.
How this is testedautomated
Send CSI > 4 ; 3 m to enable modifyOtherKeys mode 3, verify terminal is responsive, then disable with CSI > 4 ; 0 m.

The same probe runs against headless backends (via Termless) and real terminal apps (via a daemon launched in each terminal). This lets us distinguish parser correctness from rendering correctness.

Analysis2026-04-06

Supported by 10 of 12 terminals (83%). Not supported by: vt100.js, xterm.js. Part of the Rich TUI baseline. Notes: vt100.js: Not implemented — pure TypeScript emulator; xterm.js: modifyOtherKeys mode 3 not implemented in xterm.js.

Supported by 9 of 14 backends (64%)

Terminal Applications

TerminalVersionSupportNotes
iTerm23.6.9✓ yes
Ghostty1.3.1✓ yes
VS Code✓ yes
Warp✓ yes
Cursor✓ yes
Terminal.app✓ yes

Headless Backends

Parser correctness only — a means the parser accepts the sequence.

BackendVersionSupportNotes
vterm0.2.0✓ yes
Alacritty0.26.0~ partialmodifyOtherKeys mode 3 not exposed in headless mode
Kitty0.40.0~ partialmodifyOtherKeys mode 3 not exposed via Python batch bridge
WezTerm0.1.0-fork.5~ partialmodifyOtherKeys mode 3 not exposed in headless mode
vt100.js0.2.1✗ noNot implemented — pure TypeScript emulator
xterm.js5.5.0✗ nomodifyOtherKeys mode 3 not implemented in xterm.js