Customize keyboard shortcuts changedkeybindings
Nearest release: v2.1.248, published 5 hours after this site recorded the change. Shown because the two are within 24 hours of each other. Nothing here says the release caused the edit.
Recorded here
Lines+40added
Lines−23removed
From line
92
where the diff opens
First seen
14 Aug 2026
this site's first read of the page
Recorded edits43to this page, all time
### Non-US keyboard layouts
The whole hunk
from line 92, old and new numbered
/
from line 92
9292
9393Actions available in the `Chat` context:
9494
95| Action | Default | Description |
96| :-------------------- | :-------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
97| `chat:cancel` | Escape | Cancel current input |
98| `chat:clearInput` | Ctrl+L | Force a full screen redraw, preserving input and conversation |
99| `chat:clearScreen` | Cmd+K | Force a full screen redraw, preserving input and conversation. See [Clear the conversation](/docs/en/fullscreen#clear-the-conversation) for how Cmd+K behaves on iTerm2 and Terminal.app |
100| `chat:killAgents` | Ctrl+X Ctrl+K | Stop all running [background subagents](/docs/en/sub-agents#run-subagents-in-foreground-or-background) in this session and turn off [artifact auto-replies](/docs/en/artifacts#let-claude-reply-to-comments-on-its-own) for the rest of it |
101| `chat:cycleMode` | Shift+Tab\* | Cycle permission modes |
102| `chat:modelPicker` | Meta+P | Open model picker |
103| `chat:fastMode` | Meta+O | Toggle fast mode |
104| `chat:thinkingToggle` | Meta+T | Toggle extended thinking |
105| `chat:submit` | Enter | Submit message |
106| `chat:newline` | Ctrl+J | Insert a newline without submitting |
107| `chat:undo` | Ctrl+\_, Ctrl+Shift+- | Undo last action |
108| `chat:externalEditor` | Ctrl+G, Ctrl+X Ctrl+E | Open in external editor |
109| `chat:stash` | Ctrl+S | Stash current prompt |
110| `chat:imagePaste` | Ctrl+V (Alt+V on Windows and WSL) | Paste image from clipboard. On WSL, both shortcuts are bound by default |
95| Action | Default | Description |
96| :-------------------- | :-------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
97| `chat:cancel` | Escape | Cancel current input |
98| `chat:clearInput` | Ctrl+L | Force a full screen redraw, preserving input and conversation |
99| `chat:clearScreen` | Cmd+K | Force a full screen redraw, preserving input and conversation. See [Clear the conversation](/docs/en/fullscreen#clear-the-conversation) for how Cmd+K behaves on iTerm2 and Terminal.app |
100| `chat:killAgents` | Ctrl+X Ctrl+K | Stop all running [background subagents](/docs/en/sub-agents#run-subagents-in-foreground-or-background) in this session and turn off [artifact auto-replies](/docs/en/artifacts#let-claude-reply-to-comments-on-its-own) for the rest of it |
101| `chat:cycleMode` | Shift+Tab\* | Cycle permission modes |
102| `chat:modelPicker` | Meta+P | Open model picker |
103| `chat:fastMode` | Meta+O | Toggle fast mode |
104| `chat:thinkingToggle` | Meta+T | Toggle extended thinking |
105| `chat:submit` | Enter | Submit message |
106| `chat:queueSubmit` | Ctrl+X Enter | Submit the message, marked to wait its turn: while Claude is working, Claude Code [queues it](/docs/en/interactive-mode#queue-messages-while-claude-works) and never interrupts the turn. Unlike `chat:submit`, it submits the draft even while autocomplete suggestions are open. Requires v2.1.247 or later |
107| `chat:newline` | Ctrl+J | Insert a newline without submitting |
108| `chat:undo` | Ctrl+\_, Ctrl+Shift+- | Undo last action |
109| `chat:externalEditor` | Ctrl+G, Ctrl+X Ctrl+E | Open in external editor |
110| `chat:stash` | Ctrl+S | Stash current prompt |
111| `chat:imagePaste` | Ctrl+V (Alt+V on Windows and WSL) | Paste image from clipboard. On WSL, both shortcuts are bound by default |
111112
112113\*On Windows without VT mode (Node \<24.2.0/\<22.17.0, Bun \<1.2.23), defaults to Meta+M.
113114
from line 376
375376
376377Claude Code parses key names case-insensitively, so `K` is the same binding as `k` and `ctrl+K` is the same as `ctrl+k`. To bind Shift and a letter, write `shift+k`.
377378
379### Non-US keyboard layouts
380
381Write the key names of Ctrl shortcuts as Latin characters even when your active keyboard layout types other characters.
382
383How Claude Code matches the key you press to a binding depends on the kind of layout:
384
385* Under a non-Latin layout such as Cyrillic, in a terminal that uses the Kitty keyboard protocol and reports the key's US-layout position, Claude Code matches Ctrl shortcuts by that position, so with a Russian layout active, pressing Ctrl and the physical W key triggers `ctrl+w`. In a terminal that doesn't report the position, Claude Code matches whatever the terminal sends for the keypress: an ASCII control code triggers the Latin shortcut, and a keypress that arrives as the Cyrillic character matches no binding
386* Under layouts that rearrange Latin letters, such as AZERTY, Claude Code matches the letter that the key types, so pressing Ctrl and the key labeled A triggers `ctrl+a`
387
388Before v2.1.247, pressing a Ctrl shortcut under a non-Latin layout didn't trigger its binding in terminals that use the Kitty keyboard protocol, such as Ghostty, Kitty, WezTerm, and iTerm2.
389
378390### Chords
379391
380392Chords are sequences of keystrokes separated by spaces:
from line 426
414426
415427This also works for chord bindings. Unbinding every chord that shares a prefix frees that prefix for use as a single-key binding. A chord in any active context keeps its prefix reserved, so you must unbind each chord in the context that defines it.
416428
417The default `Ctrl+X` family spans two contexts: `ctrl+x ctrl+k` and `ctrl+x ctrl+e` in `Chat`, and `ctrl+x ctrl+b` in `Task`. To reclaim `ctrl+x` itself as a single-key binding, unbind all of them:
429Claude Code binds these default chords on the `ctrl+x` prefix: `ctrl+x ctrl+k`, `ctrl+x ctrl+e`, and `ctrl+x enter` in `Chat`, and `ctrl+x ctrl+b` in `Task`. The `ctrl+x enter` chord requires v2.1.247 or later. To reclaim `ctrl+x` itself as a single-key binding, unbind all of them:
418430
419431```json theme={null}
420432{
from line 442
430442 "bindings": {
431443 "ctrl+x ctrl+k": null,
432444 "ctrl+x ctrl+e": null,
445 "ctrl+x enter": null,
433446 "ctrl+x": "chat:newline"
434447 }
435448 }
from line 456
443456
444457These shortcuts cannot be rebound:
445458
446| Shortcut | Reason |
447| :-------- | :--------------------------------------------- |
448| Ctrl+C | Hardcoded interrupt/cancel |
449| Ctrl+D | Hardcoded exit |
450| Ctrl+M | Identical to Enter in terminals (both send CR) |
451| Caps Lock | Not delivered to terminal applications |
459| Shortcut | Reason |
460| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
461| Ctrl+C | Hardcoded interrupt/cancel |
462| Ctrl+D | Hardcoded exit |
463| Ctrl+M | Claude Code always receives it as Enter |
464| Ctrl+\[ | Claude Code always receives it as Escape |
465| Ctrl+I | Claude Code always receives it as Tab |
466| Ctrl+H | Sends the ASCII backspace byte. [How Claude Code reads it on Windows](/docs/en/terminal-config#fix-backspace-deleting-a-whole-word-on-windows) depends on your terminal and the [`CLAUDE_CODE_BS_AS_CTRL_BACKSPACE`](/docs/en/env-vars) environment variable |
467| Caps Lock | Not delivered to terminal applications |
452468
453469## Terminal conflicts
454470
from line 495
479495* Parse errors (invalid JSON or structure)
480496* Invalid context names
481497* Invalid action values, such as an action that isn't a string or `null`
498* Unknown action names, such as a typo of a registered action. Claude Code skips the binding and keeps any default binding for that key in effect. Before v2.1.246, a binding with an unknown action name silently disabled that key
482499* Reserved shortcut conflicts
483500* Duplicate bindings in the same context
484501
No line in this hunk matches that.