Keybindings
All keyboard shortcuts can be customized via~/.atomic/agent/keybindings.json. Each action can be bound to one or more keys.
The config file uses the same namespaced keybinding ids that Atomic uses internally and that extension authors use in keyHint() and injected keybindings managers.
Older configs using pre-namespaced ids such as cursorUp or expandTools are migrated automatically to the namespaced ids on startup.
After editing keybindings.json, run /reload in Atomic to apply the changes without restarting the session.
Key Format
modifier+key where modifiers are ctrl, shift, alt (combinable) and keys are:
- Letters:
a-z - Digits:
0-9 - Special:
escape,esc,enter,return,tab,space,backspace,delete,insert,clear,home,end,pageUp,pageDown,up,down,left,right - Function:
f1-f12 - Symbols:
`,-,=,[,],\,;,',,,.,/,!,@,#,$,%,^,&,*,(,),_,+,|,~,{,},:,<,>,?
ctrl+shift+x, alt+ctrl+x, ctrl+shift+alt+x, ctrl+1, etc.
All Actions
TUI Editor Cursor Movement
TUI Editor Deletion
TUI Input
TUI Kill Ring
TUI Clipboard and Selection
Application
When
app.clipboard.pasteImage finds text rather than an image, Atomic inserts that clipboard text into the editor instead of reporting an image-paste failure.
A held paused queue by itself is idle for Ctrl+C handling. After an interruption settles, the next Ctrl+C clears the editor without releasing or dequeuing the hold, and a second quick idle press exits normally.
In interactive sessions the agent runs in a supervised engine child (see Extensions). Escape there requests the engine’s cooperative cancellation and waits for it with no deadline; it never terminates or replaces the engine.
Both keys are recognized by their physical identity, not by the configured app.clear action, so rebinding app.clear cannot make Escape stop the engine or take the host route away from Ctrl+C.
Ctrl+C is the host’s escape hatch whenever an engine-owned ctx.ui.custom() component or overlay holds input: those forward every key to the engine, so a component that never resolves would swallow Ctrl+C. Which component gets the press is decided per mount, in this order:
- If the engine is provably not answering, the first press terminates and replaces it — a wedged child cannot run the component’s own handler either. “Not answering” means the watchdog has declared it unresponsive, a cooperative abort has gone unanswered past the same one-second threshold, a replacement has been waiting for readiness past it, or a replacement failed. A failed replacement keeps Ctrl+C armed so another press can try again; Atomic never retries on its own.
- Otherwise, if the component declared
handlesCtrlCwhen it was mounted, it receives the press and keeps its own Skip, Close, or cancel behavior. The bundled workflow surfaces declare it. If the same component is still holding input on the next press, that press closes it. - Otherwise the first press closes that one component, exactly as if it had been cancelled: its
ctx.ui.custom()promise resolves withundefined, the editor comes back, and the engine — along with everything else it has mounted or is running — is left alone.
tui.select.cancel still keeps Ctrl+C as local cancel inside host-native selectors, dialogs, input forms, and session pickers.
Sessions
Models and Thinking
Display and Message Queue
Tree Navigation
Scoped Models Selector
Used inside the scoped models selector (opened via/scoped-models).
Custom Configuration
Create~/.atomic/agent/keybindings.json:
app.suspend has no default binding because Windows terminals do not support Unix job control. If you bind it manually, Atomic shows a status message instead of suspending. In WSL, the normal Linux ctrl+z/fg behavior still applies.