Skip to content

Platform Quirks

Terminal capabilities, OS interceptors, and platform-specific keybinding behaviors that affect how Claude Code receives and processes keys.

Modifier-only chord sequences (like shift+tab) may fail on Windows Terminal without VT (Virtual Terminal) mode enabled. This is a longstanding Windows Terminal limitation.

See: https://github.com/microsoft/terminal/issues/879

Claude Code detects VT mode support at runtime:

  • Node.js: Enabled in 22.17.0 and 24.2.0+ (not 23.x)
  • Bun: Enabled in 1.2.23+

If running with an older version on Windows Terminal without VT mode, modifier-only chords don’t reach Claude Code; the terminal intercepts them.

If you’re on Windows Terminal with shift+tab not working for editor mode cycling, Claude Code falls back to meta+m instead.

Feature detection (from defaultBindings.ts):

const SUPPORTS_TERMINAL_VT_MODE =
getPlatform() !== 'windows' ||
(isRunningWithBun()
? satisfies(process.versions.bun, '>=1.2.23')
: satisfies(process.versions.node, '>=22.17.0 <23.0.0 || >=24.2.0'))
const MODE_CYCLE_KEY = SUPPORTS_TERMINAL_VT_MODE ? 'shift+tab' : 'meta+m'
  • Windows Terminal 1.22+ users: Keep your Node/Bun runtime updated.
  • Older Windows Terminal or third-party terminals: Use meta+m for editor mode cycling.

macOS intercepts all cmd+* combinations at the OS level; they do not reach Claude Code. This includes:

KeyOS ActionSeverity
cmd+cSystem copyError
cmd+vSystem pasteError
cmd+xSystem cutError
cmd+qQuit applicationError
cmd+wClose windowError
cmd+tabApp switcherError
cmd+spaceSpotlightError

These keys are reserved and cannot be used in Claude Code.

If you’re using a terminal with kitty keyboard protocol support, the cmd key can reach Claude Code because the protocol bypasses the OS clipboard interception.

Terminals with kitty protocol:

  • kitty
  • WezTerm
  • ghostty
  • iTerm2 (partial)

Example: cmd+shift+f for global search works on these terminals but not on stock macOS Terminal.

Use meta+ or ctrl+shift+ instead of cmd+:

  • meta+p (portable) vs. cmd+p (kitty-protocol only)
  • ctrl+shift+f (portable) vs. cmd+shift+f (kitty-protocol only)

On Linux terminals, meta typically maps to alt unless running in a kitty terminal (where meta = super / cmd).

ModifierStandard LinuxKitty Protocol
metaaltsuper / cmd
cmdNot availableAvailable
  • Standard Linux terminals: Use alt+ or ctrl+shift+.
  • Kitty terminal: Both meta and cmd work; use whichever feels natural.

Claude Code automatically selects the correct image paste key per platform:

PlatformKeyReason
Windowsalt+vCtrl+V is reserved for system paste
macOSctrl+vSystem paste is cmd+v
Linuxctrl+vSystem paste is ctrl+v, but intercepted by some DMs

If the auto-selected key conflicts with your setup, rebind in keybindings.json:

{
"Chat": {
"ctrl+alt+i": "chat:imagePaste"
}
}

ctrl+b is used by Claude Code for backgrounding tasks, but it’s also the default tmux prefix key.

When you press ctrl+b in a tmux session running Claude Code:

  1. First ctrl+b press: Captured by tmux (prefix mode activated).
  2. Second key: Depends on what you press.
  3. To reach Claude Code: Press ctrl+b twice in rapid succession.
tmux session $ <ctrl+b> <ctrl+b> # Double-tap ctrl+b
↑ tmux sees this and enters prefix mode
↑ Claude Code receives this
Claude Code: Task backgrounded
  1. Rebind Claude Code’s background key to something else that doesn’t conflict:
{
"Task": {
"ctrl+alt+b": "task:background"
}
}
  1. Rebind tmux prefix if you prefer (in ~/.tmux.conf):
Terminal window
unbind C-b
set-option -g prefix C-a
bind-key C-a send-prefix

Then Claude Code’s ctrl+b works on first press.

  1. Use a different terminal multiplexer (screen, zellij, etc.) if the conflict is frequent.
KeyPlatformTerminalWorks
ctrl+shift+cAllAny
cmd+cmacOS onlyKitty protocol
cmd+cmacOS onlyStandard Terminal.app✗ (OS-intercepted)

Recommendation: Use ctrl+shift+c for maximum compatibility.

SignalKeyPlatformSeverity
SIGTSTP (suspend)ctrl+zUnix/Linux/macOSWarning (stops the process)
SIGQUIT (quit)ctrl+\\Unix/Linux/macOSError (terminates the app)
SIGINT (interrupt)ctrl+cAllError (hardcoded, non-rebindable)
  • ctrl+z is catchable; Claude Code doesn’t bind it, so the OS suspends the process. Press fg in the shell to resume.
  • ctrl+\\ terminates Claude Code.
  • ctrl+c is hardcoded for interrupt; no user override is allowed.
  • ctrl+s (XOFF): Pauses output. Not reserved because most modern terminals disable flow control by default.
  • ctrl+q (XON): Resumes output. Not reserved for the same reason.

Claude Code uses ctrl+s for stashing prompts, which works on most modern systems.

Caveat: If you’re on an older system with flow control enabled, ctrl+s may suspend output. Disable flow control in your terminal (e.g., stty -ixon in bash).

EmulatorShift+TabCmd KeysKitty ProtocolNotes
Windows Terminal 1.22+N/ANoVT mode enabled in Node 24.2+, Bun 1.2.23+
iTerm2 (macOS)PartialPartialKitty protocol support (beta)
Terminal.app (macOS)NoSystem intercepts cmd+*; use meta+
GNOME TerminalN/ANoStandard Linux terminal
Konsole (KDE)N/ANoStandard Linux terminal
kittyFull support for all keys
WezTermFull support; kitty protocol optional
ghosttyFull support
tmux✓ (with prefix collision)N/ADepends on outer terminalInherits capabilities from host terminal
screenN/ANoOlder multiplexer; limited key support
ScenarioRecommendation
Windows TerminalUpdate Node/Bun; use shift+tab or meta+m
macOS + Terminal.appUse ctrl+shift+* or meta+* (not cmd+*)
macOS + kitty/WezTermUse cmd+* or meta+* freely
Linux (standard)Use ctrl+shift+* or alt+*
Linux + kittyUse meta+* or super+*
tmuxRebind ctrl+b for Claude Code or use double-tap

← Back to Keybindings/README.md