XTMODKEYS — Modify keyboard reporting (CSI > Pp ; Pv m)
Switch xterm's modifyKeyboard / modifyCursorKeys / modifyFunctionKeys / modifyOtherKeys resources at runtime — the foundation for Ctrl+letter, Alt+letter disambiguation.
Byte forms
Every common string-literal form so you can paste-and-search either direction.
\x1b[><Pp>;<Pv>m\033[>4;2m\e[>4;2mESC [ > Pp ; Pv m1b 5b 3e ... 6dDescription
The > prefix flips the m final byte from SGR (set-graphic-rendition) to XTMODKEYS — a runtime-mutable view of four xterm resources that control how modifier-laden keys are reported. The first parameter Pp selects the resource (0 = modifyKeyboard, 1 = modifyCursorKeys, 2 = modifyFunctionKeys, 3 = modifyKeypadKeys is reserved, 4 = modifyOtherKeys), and Pv sets its value. The killer feature is modifyOtherKeys (Pp=4): with Pv=0 xterm only reports Ctrl+letter as the corresponding C0 byte (Ctrl+I === Tab, Ctrl+M === Enter), with Pv=1 it reports modified versions of unambiguous keys via CSI 27 ~, and with Pv=2 it reports every modified printable key — letting editors like vim/emacs/kakoune distinguish Ctrl+I from Tab, Ctrl+H from Backspace, and bind Alt+letter without the legacy ESC-prefix hack. Reset by emitting \x1b[>Pp m with no Pv (restores xterm default) or \x1b[>4;0m to leave modifyOtherKeys mode. Kitty's CSI u keyboard protocol (separate sequence) offers a strictly richer alternative and is preferred for greenfield code; XTMODKEYS remains the de-facto compatibility path for the millions of TUIs already targeting xterm.
Spec citation: xterm-ctlseqs (XTMODKEYS)
Parameters
| Pp | Resource selector: 0 modifyKeyboard, 1 modifyCursorKeys, 2 modifyFunctionKeys, 4 modifyOtherKeys. |
| Pv | New value for the resource. For modifyOtherKeys: 0 off, 1 modified-only-when-unambiguous, 2 always modified. |
Examples
# Enable full modifyOtherKeys — every Ctrl+letter reports distinctly:\nprintf '\033[>4;2m'\n# (run from inside a TUI that handles CSI 27 ~ replies; raw shells will show garbage)import sys\nsys.stdout.write('\x1b[>4;2m') # enable modifyOtherKeys 2\n# remember to send '\x1b[>4;0m' on exit to restore defaultfmt.Print("\x1b[>4;1m") // modifyOtherKeys mode 1process.stdout.write('\x1b[>4;2m') // enable full modify-other-keysprintf("\x1b[>4;2m"); /* opt in to fully-modified key reports */\natexit_send("\x1b[>4;0m"); /* opt out at exit */Terminal support
- xterm
- yes
- Linux console (fbcon)
- no
- macOS Terminal.app
- no
- iTerm2
- yes
- Windows Terminal
- yes
- cmd.exe / ConPTY
- no
- kitty
- yes
- alacritty
- yes
- WezTerm
- yes
- Ghostty
- yes
- GNOME Terminal
- partial
- Konsole
- yes
- 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 | no | no | yes | yes | no | yes | yes | yes | yes | partial | yes | yes | yes |