Skip to content

modifyOtherKeys mode 3 โ€‹

Category: input ยท Tags: Xterm ext ยท 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 tested: Send CSI > 4 ; 3 m to enable modifyOtherKeys mode 3, verify terminal is responsive, then disable with CSI > 4 ; 0 m.
Analysis2026-03-26

Supported by 4 of 6 terminals (67%). 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 2 of 18 backends (11%)

Terminal Applications โ€‹

TerminalVersionSupportNotes
cmuxโœ“ yes
iTerm23.6.9? unknown
Ghostty1.3.1? unknown
VS Code1.112.0? unknown
Cursor2.6.21? unknown
Warp0.2026.03.18.08.24.03? unknown
Terminal.app2.15? unknown
Kitty0.46.2? unknownmodifyOtherKeys mode 3 not exposed via Python batch bridge

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
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? unknownmodifyOtherKeys mode 3 not implemented in xterm.js
xterm.js6.0.0? unknownmodifyOtherKeys mode 3 not implemented in xterm.js
xterm.js5.4.0? unknownmodifyOtherKeys mode 3 not implemented in xterm.js
xterm.js6.1.0-beta.195? unknownmodifyOtherKeys mode 3 not implemented in xterm.js

Powered by Termless
Playwright for Terminals