Keyboard shortcuts
Everything you can press in an interactive syntic session, and how to change the keys. Type /keybindings in a session for the live list, including any keys you changed.
Ctrl+X Ctrl+E means: press Ctrl+X, release, then press Ctrl+E. On a Mac, Alt is the Option key (see Mac keyboards).
Anywhere
| Key | Does |
|---|---|
Esc | Close whatever is open (panel, menu, picker, notice). With nothing open: stop the running reply, or clear the prompt. |
Esc Esc | On an empty prompt: open rewind (Checkpoints & rewind). |
Ctrl+C | Close an open panel; otherwise stop the reply; otherwise clear the prompt (↑ brings it back). Twice on an empty prompt: quit. |
Ctrl+D | Twice on an empty prompt: quit. With text: remove the character at the cursor. |
Ctrl+Q | Twice: quit. |
Shift+Tab | Move to the next permission mode: default → auto-edit → plan → auto → (bypass). See Permission modes. |
Ctrl+B | While a turn runs: send the running shell command, subagent or MCP call (or the whole turn) to the background. |
Ctrl+O | Open or close the full transcript. |
Ctrl+T | Show or hide the task checklist. |
Ctrl+R | Search earlier prompts; press again for the next match. |
Ctrl+L | Redraw the screen. |
Ctrl+Z | Suspend to your shell; fg resumes. |
Alt+P | Model picker. |
Alt+O | Fast mode on or off. |
Alt+T | Switch reasoning on or off until you switch again. |
Ctrl+X Ctrl+K | Stop every background agent (a second press within 3 s confirms). |
PageUp / PageDown | Scroll a screen. Shift+↑ / Shift+↓ scroll a line. Ctrl+Home / Ctrl+End jump to the top or bottom. |
? | On an empty prompt: the help screen. |
← | On an empty prompt: the agents view (same as /tasks). |
In the prompt box
| Key | Does |
|---|---|
Enter | Send. While the agent works, the message is queued for its next step. |
Shift+Enter, Alt+Enter, Ctrl+J, \ Enter | New line. Ctrl+J and \ Enter work in every terminal. |
Ctrl+Enter, Ctrl+X Ctrl+S | Send now: hand this (and anything queued) to the agent right away instead of waiting for the current step to end. |
↑ / ↓ | Move between lines; on the first or last line, step through prompt history. On an empty prompt with queued messages, ↑ pulls the newest one back for editing. |
→ at the end | Take the grey suggestion. |
Ctrl+A / Ctrl+E | Start / end of the line. |
Alt+B / Alt+F, Ctrl+← / Ctrl+→ | One word left / right. |
Ctrl+W, Alt+Backspace | Delete the word before the cursor. |
Alt+D, Ctrl+Delete | Delete the word after the cursor. |
Ctrl+U / Ctrl+K | Cut back to the line start / forward to the line end. |
Ctrl+Y | Paste back what you last deleted. Alt+Y right after cycles through older deletions. |
Ctrl+_, Ctrl+/ | Undo the last edit (needs a terminal with the enhanced keyboard protocol). |
Ctrl+S | Stash the prompt; press again on an empty prompt to restore it. |
Ctrl+G, Ctrl+X Ctrl+E | Edit the prompt in $VISUAL / $EDITOR. |
Ctrl+V | Paste an image from the clipboard. |
Tab | Complete a /command, or a file path in a ! line. |
Menus and pickers
Menus pop up for / commands, @ mentions, command arguments and : emoji. Pickers include /model, /theme, /resume, /rewind, /config, /permissions, /mcp, /plugin and more.
| Key | Does |
|---|---|
↑ / ↓, Ctrl+P / Ctrl+N, k / j | Move the highlight. |
Enter | Choose. In the / menu this runs the command. |
Tab, → | Insert the highlighted entry (in @ menus, Tab first fills the shared part). |
1–9 | Pick that row (panels, theme picker, permission dialog). |
Esc, q | Close. |
| Mouse | Click a row to highlight it, click again to choose. The wheel moves the highlight. |
Extra keys in some pickers:
| Picker | Key | Does |
|---|---|---|
/model | Enter / s | Use and save as default / use for this session only. |
/resume | type | Filter. |
Tab | This folder only, or every folder. | |
Ctrl+R | Rename the highlighted session. | |
Ctrl+D | Delete it (asks first; the current session cannot be deleted). | |
/plugin, /skills | Enter, Space | Turn a plugin on or off / put the skill’s command in the prompt. |
Permission prompts
| Key | Does |
|---|---|
Enter, 1–9 | Choose an answer. |
Esc | Deny. |
t | Deny and type what to do instead. |
Tab | On a “Yes” answer: approve and add a note for the agent. |
s | Where “don’t ask again” is offered: choose which settings file the rule is saved to. |
Ctrl+A | On a shell-command prompt: approve and switch to auto mode. |
No single letter approves by default, so a stray keypress never says yes for you.
Questions from the agent
When the agent asks you to choose, use ↑ / ↓ or 1–9, Space to tick options in a multi-choice question, Tab / Shift+Tab to move between questions, Enter to answer and Esc to dismiss.
Transcript view (Ctrl+O)
| Key | Does |
|---|---|
↑ / ↓, k / j | Scroll a line. |
PageUp / PageDown, Space | Scroll a screen. Ctrl+U / Ctrl+D scroll half. |
g / G | Top / bottom. |
{ / } | Previous / next prompt you sent. |
/, then n / N | Search, then next / previous match. |
v | Open the transcript in your editor. |
[ | Write the transcript into your terminal’s scrollback and close. |
q, Esc | Close. |
Vim mode
Turn it on with /vim, the vim row in /config, "vimMode": true, or SYNTIC_VIM_MODE=1. The prompt then starts in normal mode.
| Normal-mode keys | Do |
|---|---|
i a I A o O | Enter insert mode at the usual places. |
h l w b e 0 $ | Move. A count repeats (3w). |
f F t T + letter, ; , | Find a character, repeat. |
j / k | Next / previous line, or prompt history on a one-line prompt. |
x, d/c/y + motion, dd cc yy, D C Y, s S | Delete, change, copy. |
p / P, u | Paste, undo. |
v, V | Visual selection. |
/ | Search prompt history. |
:w / :q / :wq | Send / clear / send. |
Enter | Send. |
To leave insert mode by typing two letters quickly, add for example "vimInsertModeRemaps": { "jk": "<Esc>" } to your settings. The yank register is remembered across sessions (text that looks like a secret is never saved); set "vimRegisterPersist": false to stop that.
Terminal and mouse
Getting Shift+Enter and the Alt shortcuts to work in your terminal (including Option as Meta on a Mac and /terminal-setup) is covered on Terminal setup. How the mouse selects, copies and scrolls in each view, and how to hand it back to your terminal with SYNTIC_DISABLE_MOUSE=1, is on Full-screen mode.
Change the keys
Your own bindings live in ~/.syntic/keybindings.json (or keybindings.json inside SYNTIC_CONFIG_DIR when that is set). The easiest start:
/keybindings editThis creates the file filled with the current bindings and shows its path. An existing file is never overwritten; you just get its path. Edit and save: the file is checked again on your next key press (at most every 300 ms), so changes apply without a restart. /keybindings on its own shows the live table, including your changes and any problems found.
File format
The simple format groups bindings by context. Each entry maps a key to an action:
{
"Global": {
"Alt+M": "Choose model",
"Ctrl+Q": "Quit"
},
"Composer": {
"Ctrl+E": "Edit in $EDITOR",
"Alt+S": "chat:stash"
},
"_comment": "Keys starting with _ or $ are ignored, so you can leave notes."
}The second format is a list of blocks. It can also remove a key (null) or make a key run a slash command ("command:<name>"):
{
"bindings": [
{
"context": "Composer",
"bindings": {
"Ctrl+G": "command:compact",
"Ctrl+S": null,
"Alt+Enter": "Insert line break"
}
},
{
"context": "Global",
"bindings": { "Alt+R": "command:rewind" }
}
]
}- A binding replaces whatever that key did in that context.
nullunbinds the key in that context. If nothing was bound there, you get a note saying so.command:<name>runs/<name>when the key is pressed, as if you had typed it. The key’s previous action in that context is removed.- Only the list format understands
nullandcommand:. Use one format per file.
Contexts
Bindings live in a context, which says where focus is. A key is looked up in the most specific context first, then in Global.
| Context | Other names accepted | Active when |
|---|---|---|
Global | app | Everywhere, unless a more specific context binds the same key. |
Composer | chat | Typing in the prompt box. |
Streaming | The prompt box while a reply is running (checked before Composer). | |
Picker / overlay | picker, overlay, select, autocomplete | A menu, picker, panel or full-screen view is open, or a /, @ or folder menu is showing. |
Plan review | plan | Reviewing a proposed plan. |
Approval dialog | approval, permission, confirmation | A permission prompt is open. |
Context names are not case sensitive. While you are typing free text into a dialog field (for example the note after t on a permission prompt), no key is remapped.
Key names
Write a key as modifiers and one key joined with +, in any order and any letter case: Ctrl+E, alt+enter, Shift+Tab.
| Part | Accepted |
|---|---|
| Modifiers | Ctrl (or Control), Alt (or Opt, Option), Shift. Cmd and Command are read as Alt, because that is what the terminal reports. |
| Named keys | Enter (or Return), Tab, Esc (or Escape), Space, Up, Down, Left, Right, Home, End, PageUp, PageDown, Delete (or Del), Backspace (or Bksp, BS), BackTab. |
| Characters | Any single character: a, /, _, [. |
Only single keys can be bound. The two-step Ctrl+X sequences (Ctrl+X Ctrl+E, Ctrl+X Ctrl+K, Ctrl+X Ctrl+S) are fixed.
Every action
Write an action by its name (first column) or by its id (second column). Both are matched without regard to case.
| Action | Id | Context | Default keys |
|---|---|---|---|
| Send message | chat:submit, submit, send | Composer | Enter |
| Insert line break | chat:newline, newline | Composer | Shift+Enter, Alt+Enter, Ctrl+J |
| Abort / interrupt | app:interrupt, chat:cancel, interrupt | Composer, Streaming | Ctrl+C; Esc while streaming |
| Send now (interrupt) | chat:sendNow | Composer | Ctrl+Enter, Ctrl+X Ctrl+S |
| Cycle permission mode | chat:cycleMode, cycle-mode | Global | Shift+Tab |
| Previous history entry | history:previous | Composer | ↑ |
| Next history entry | history:next | Composer | ↓ |
| Search history | history:search | Global | Ctrl+R |
| Open command palette | Composer | / | |
| Complete path | Composer | Tab | |
| Paste image | chat:imagePaste | Composer | Ctrl+V |
| Edit in $EDITOR | chat:externalEditor | Composer | Ctrl+G, Ctrl+X Ctrl+E |
| Stash draft | chat:stash | Composer | Ctrl+S |
| Undo edit | chat:undo | Global | Ctrl+_ |
| Delete previous word | Composer | Ctrl+W, Alt+Backspace | |
| Delete next word | Composer | Alt+D, Ctrl+Delete | |
| Kill to start of line | Composer | Ctrl+U | |
| Kill to end of line | Composer | Ctrl+K | |
| Go to line start | Composer | Ctrl+A | |
| Go to line end | Composer | Ctrl+E | |
| Word left | Composer | Alt+B, Ctrl+← | |
| Word right | Composer | Alt+F, Ctrl+→ | |
| Paste deleted text | Composer | Ctrl+Y | |
| Cycle deleted text | Composer | Alt+Y | |
| Stop all background agents | chat:killAgents | Composer | Ctrl+X Ctrl+K |
| Run in background | task:background | Global | Ctrl+B |
| Choose model | chat:modelPicker | Global | Alt+P |
| Toggle fast mode | chat:fastMode | Global | Alt+O |
| Toggle thinking on/off | chat:thinkingToggle | Global | Alt+T |
| Toggle to-do panel | app:toggleTodos | Global | Ctrl+T |
| Toggle transcript | app:toggleTranscript | Global | Ctrl+O |
| Redraw screen | app:redraw | Global | Ctrl+L |
| Quit | app:exit, quit | Global | Ctrl+Q (press twice) |
| Scroll up | scroll:lineUp | Global, Plan review | Shift+↑; ↑ in plan review |
| Scroll down | scroll:lineDown | Global, Plan review | Shift+↓; ↓ in plan review |
| Page up | scroll:pageUp | Global | PageUp, Shift+PageUp |
| Page down | scroll:pageDown | Global | PageDown, Shift+PageDown |
| Scroll to top | scroll:top | Global | Ctrl+Home |
| Scroll to bottom | scroll:bottom | Global | Ctrl+End |
| Select previous | select:previous | Picker, Approval | ↑, Ctrl+P; k in approvals |
| Select next | select:next | Picker, Approval | ↓, Ctrl+N; j in approvals |
| Accept selection | select:accept | Picker, Approval | Enter; also Tab in pickers |
| Dismiss overlay | select:cancel | Picker | Esc |
| Approve plan | Plan review | Enter | |
| Reject plan | Plan review | Esc | |
| Allow once | confirm:yes | Approval | none |
| Allow always | Approval | none | |
| Deny | confirm:no | Approval | Esc |
| Deny and explain | Approval | t |
Two notes on the table:
- Allow once and Allow always have no key by default, so that no single key approves a tool call by accident. You can bind one yourself, for example
{"context": "Approval dialog", "bindings": {"y": "Allow once"}}, but think about whether you want that. - An action only does something in the context where it makes sense. Binding Approve plan in
Composer, for instance, has no effect.
Keys you cannot take
| Key | Why |
|---|---|
Ctrl+C | Stops a running reply and, pressed twice, quits. Always works. |
Ctrl+D | Quits from an empty prompt. Always works. |
Ctrl+M | The terminal sends exactly the same thing as Enter, so it cannot be told apart. |
A binding for one of these is refused, and null cannot unbind Ctrl+C or Ctrl+D either.
These are accepted, with a warning, because something else usually gets them first:
| Key | Usually taken by |
|---|---|
Ctrl+Z | The shell’s job control (suspend). |
Ctrl+\ | The shell’s job control (quit signal). |
Cmd+C, Cmd+V, Cmd+X, Cmd+Q, Cmd+W, Cmd+Tab, Cmd+Space | macOS itself (only warned about on a Mac). |
When a binding is not accepted
Problems are listed when Syntic Code starts and in /keybindings. The rest of the file still applies.
| Message | Meaning |
|---|---|
keybindings.json is not valid JSON; using defaults | The file could not be read as JSON. None of it applies until it is fixed. |
unknown surface '…' / unknown context '…' | The context name is not one of those listed above. |
unknown action '…' | The action name or id does not match any action. |
malformed key '…': Chord step "…" has modifiers but no key. | For example Ctrl+. |
… has more than one non-modifier key. | For example Ctrl+A+B. |
… has a stray or doubled "+". | For example Ctrl++A. |
'…' is reserved and cannot be rebound | One of the three keys you cannot take. |
'…' bound to … but may be intercepted | One of the warned keys. The binding is applied. |
nothing is bound to '…' in …, so there is nothing to unbind | A null for a key that had no binding there. |
'…' has an empty command: value | command: with no command name. |
/keybindings also has a Warnings section for conflicts your file introduces: for example, a key in Composer that now hides a different Global action.
To edit the prompt with vim keys instead, see Vim mode above and Terminal setup.