obsidian/wiki/dotfiles/wezterm-keyboard-encoding.md
2026-04-17 12:57:29 +01:00

3.6 KiB

title aliases tags sources created updated
WezTerm Keyboard Encoding
wezterm-key-encoding
terminal-keyboard-encoding
wezterm
terminal
keyboard
encoding
kitty-protocol
xterm
raw/Keyboard Encoding - Wez's Terminal Emulator.md
2026-04-17 2026-04-17

Overview

When a keypress doesn't match a key assignment, WezTerm encodes it into a byte stream sent to the PTY. Four encoding schemes are supported, with a priority order that determines which wins.

Encoding Schemes

1. Default — xterm Compatible

  • Generates events for key presses only (not releases)
  • Covers the key set from 1980s terminal hardware
  • Main limitation: ambiguity with Control modifier — e.g. Ctrl-I = ASCII Tab, indistinguishable from Tab itself

2. xterm modifyOtherKeys

  • Triggered by escape sequence CSI >4;Nm (N = 0, 1, or 2)
  • Encodes certain modified keys unambiguously so apps can tell Ctrl-I from Tab
  • Spec: modifyOtherKeys
  • Available since WezTerm 20221119-145034-49b9839f
  • Overridden by enable_csi_u_key_encoding and allow_win32_input_mode

3. CSI-u / fixterms / libtickit

  • Config: enable_csi_u_key_encoding = true
  • Attempts to resolve xterm ambiguity and expose more modifiers
  • Not recommended — breaks some keys in backwards-incompatible ways; apps cannot detect or request it
  • Overridden by allow_win32_input_mode

4. Kitty Keyboard Protocol

  • Config: enable_kitty_keyboard = true
  • Most capable: apps can request varying levels of enhancement
  • Adds support for CMD / Super / Windows modifier keys
  • Apps opt-in via escape sequences; WezTerm honors those requests when enabled
  • Spec: Kitty comprehensive keyboard protocol

5. Win32 Input Mode (Windows only)

  • Config: allow_win32_input_mode — defaults to true on Windows
  • Enables key release events and distinguishes left/right modifier keys
  • Best compatibility with win32 console apps (e.g. Far Manager)
  • Highest priority — overrides both CSI-u and modifyOtherKeys

Priority Order

Win32 Input Mode  >  CSI-u  >  Kitty Protocol  >  modifyOtherKeys  >  xterm default

allow_win32_input_mode wins everything on Windows. enable_csi_u_key_encoding beats modifyOtherKeys.

Config Options Reference

Option Type Default Effect
enable_kitty_keyboard bool false Honor app requests for kitty protocol
enable_csi_u_key_encoding bool false Enable CSI-u/fixterms encoding (not recommended)
allow_win32_input_mode bool true (Win) Enable Win32 Input Mode on Windows

Key Takeaways

  • WezTerm defaults to xterm-compatible encoding — works everywhere but has modifier ambiguity
  • Kitty Keyboard Protocol is the modern, recommended enhancement — apps opt in via escape sequences
  • CSI-u (enable_csi_u_key_encoding) is available but not recommended due to backwards-compatibility breakage
  • On Windows, allow_win32_input_mode = true by default and takes highest priority
  • Encoding scheme choice matters for Neovim, Emacs, and other apps that rely on distinguishing modified keys