ConfigurationInterfaceKeyboard shortcuts

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

KeyDoes
EscClose whatever is open (panel, menu, picker, notice). With nothing open: stop the running reply, or clear the prompt.
Esc EscOn an empty prompt: open rewind (Checkpoints & rewind).
Ctrl+CClose an open panel; otherwise stop the reply; otherwise clear the prompt (↑ brings it back). Twice on an empty prompt: quit.
Ctrl+DTwice on an empty prompt: quit. With text: remove the character at the cursor.
Ctrl+QTwice: quit.
Shift+TabMove to the next permission mode: default → auto-edit → plan → auto → (bypass). See Permission modes.
Ctrl+BWhile a turn runs: send the running shell command, subagent or MCP call (or the whole turn) to the background.
Ctrl+OOpen or close the full transcript.
Ctrl+TShow or hide the task checklist.
Ctrl+RSearch earlier prompts; press again for the next match.
Ctrl+LRedraw the screen.
Ctrl+ZSuspend to your shell; fg resumes.
Alt+PModel picker.
Alt+OFast mode on or off.
Alt+TSwitch reasoning on or off until you switch again.
Ctrl+X Ctrl+KStop every background agent (a second press within 3 s confirms).
PageUp / PageDownScroll 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

KeyDoes
EnterSend. While the agent works, the message is queued for its next step.
Shift+Enter, Alt+Enter, Ctrl+J, \ EnterNew line. Ctrl+J and \ Enter work in every terminal.
Ctrl+Enter, Ctrl+X Ctrl+SSend 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 endTake the grey suggestion.
Ctrl+A / Ctrl+EStart / end of the line.
Alt+B / Alt+F, Ctrl+← / Ctrl+→One word left / right.
Ctrl+W, Alt+BackspaceDelete the word before the cursor.
Alt+D, Ctrl+DeleteDelete the word after the cursor.
Ctrl+U / Ctrl+KCut back to the line start / forward to the line end.
Ctrl+YPaste 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+SStash the prompt; press again on an empty prompt to restore it.
Ctrl+G, Ctrl+X Ctrl+EEdit the prompt in $VISUAL / $EDITOR.
Ctrl+VPaste an image from the clipboard.
TabComplete a /command, or a file path in a ! line.

Menus pop up for / commands, @ mentions, command arguments and : emoji. Pickers include /model, /theme, /resume, /rewind, /config, /permissions, /mcp, /plugin and more.

KeyDoes
↑ / ↓, Ctrl+P / Ctrl+N, k / jMove the highlight.
EnterChoose. In the / menu this runs the command.
Tab, →Insert the highlighted entry (in @ menus, Tab first fills the shared part).
1–9Pick that row (panels, theme picker, permission dialog).
Esc, qClose.
MouseClick a row to highlight it, click again to choose. The wheel moves the highlight.

Extra keys in some pickers:

PickerKeyDoes
/modelEnter / sUse and save as default / use for this session only.
/resumetypeFilter.
TabThis folder only, or every folder.
Ctrl+RRename the highlighted session.
Ctrl+DDelete it (asks first; the current session cannot be deleted).
/plugin, /skillsEnter, SpaceTurn a plugin on or off / put the skill’s command in the prompt.

Permission prompts

KeyDoes
Enter, 1–9Choose an answer.
EscDeny.
tDeny and type what to do instead.
TabOn a “Yes” answer: approve and add a note for the agent.
sWhere “don’t ask again” is offered: choose which settings file the rule is saved to.
Ctrl+AOn 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)

KeyDoes
↑ / ↓, k / jScroll a line.
PageUp / PageDown, SpaceScroll a screen. Ctrl+U / Ctrl+D scroll half.
g / GTop / bottom.
{ / }Previous / next prompt you sent.
/, then n / NSearch, then next / previous match.
vOpen the transcript in your editor.
[Write the transcript into your terminal’s scrollback and close.
q, EscClose.

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 keysDo
i a I A o OEnter 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 / kNext / previous line, or prompt history on a one-line prompt.
x, d/c/y + motion, dd cc yy, D C Y, s SDelete, change, copy.
p / P, uPaste, undo.
v, VVisual selection.
/Search prompt history.
:w / :q / :wqSend / clear / send.
EnterSend.

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 edit

This 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.
  • null unbinds 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 null and command:. 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.

ContextOther names acceptedActive when
GlobalappEverywhere, unless a more specific context binds the same key.
ComposerchatTyping in the prompt box.
StreamingThe prompt box while a reply is running (checked before Composer).
Picker / overlaypicker, overlay, select, autocompleteA menu, picker, panel or full-screen view is open, or a /, @ or folder menu is showing.
Plan reviewplanReviewing a proposed plan.
Approval dialogapproval, permission, confirmationA 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.

PartAccepted
ModifiersCtrl (or Control), Alt (or Opt, Option), Shift. Cmd and Command are read as Alt, because that is what the terminal reports.
Named keysEnter (or Return), Tab, Esc (or Escape), Space, Up, Down, Left, Right, Home, End, PageUp, PageDown, Delete (or Del), Backspace (or Bksp, BS), BackTab.
CharactersAny 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.

ActionIdContextDefault keys
Send messagechat:submit, submit, sendComposerEnter
Insert line breakchat:newline, newlineComposerShift+Enter, Alt+Enter, Ctrl+J
Abort / interruptapp:interrupt, chat:cancel, interruptComposer, StreamingCtrl+C; Esc while streaming
Send now (interrupt)chat:sendNowComposerCtrl+Enter, Ctrl+X Ctrl+S
Cycle permission modechat:cycleMode, cycle-modeGlobalShift+Tab
Previous history entryhistory:previousComposer↑
Next history entryhistory:nextComposer↓
Search historyhistory:searchGlobalCtrl+R
Open command paletteComposer/
Complete pathComposerTab
Paste imagechat:imagePasteComposerCtrl+V
Edit in $EDITORchat:externalEditorComposerCtrl+G, Ctrl+X Ctrl+E
Stash draftchat:stashComposerCtrl+S
Undo editchat:undoGlobalCtrl+_
Delete previous wordComposerCtrl+W, Alt+Backspace
Delete next wordComposerAlt+D, Ctrl+Delete
Kill to start of lineComposerCtrl+U
Kill to end of lineComposerCtrl+K
Go to line startComposerCtrl+A
Go to line endComposerCtrl+E
Word leftComposerAlt+B, Ctrl+←
Word rightComposerAlt+F, Ctrl+→
Paste deleted textComposerCtrl+Y
Cycle deleted textComposerAlt+Y
Stop all background agentschat:killAgentsComposerCtrl+X Ctrl+K
Run in backgroundtask:backgroundGlobalCtrl+B
Choose modelchat:modelPickerGlobalAlt+P
Toggle fast modechat:fastModeGlobalAlt+O
Toggle thinking on/offchat:thinkingToggleGlobalAlt+T
Toggle to-do panelapp:toggleTodosGlobalCtrl+T
Toggle transcriptapp:toggleTranscriptGlobalCtrl+O
Redraw screenapp:redrawGlobalCtrl+L
Quitapp:exit, quitGlobalCtrl+Q (press twice)
Scroll upscroll:lineUpGlobal, Plan reviewShift+↑; ↑ in plan review
Scroll downscroll:lineDownGlobal, Plan reviewShift+↓; ↓ in plan review
Page upscroll:pageUpGlobalPageUp, Shift+PageUp
Page downscroll:pageDownGlobalPageDown, Shift+PageDown
Scroll to topscroll:topGlobalCtrl+Home
Scroll to bottomscroll:bottomGlobalCtrl+End
Select previousselect:previousPicker, Approval↑, Ctrl+P; k in approvals
Select nextselect:nextPicker, Approval↓, Ctrl+N; j in approvals
Accept selectionselect:acceptPicker, ApprovalEnter; also Tab in pickers
Dismiss overlayselect:cancelPickerEsc
Approve planPlan reviewEnter
Reject planPlan reviewEsc
Allow onceconfirm:yesApprovalnone
Allow alwaysApprovalnone
Denyconfirm:noApprovalEsc
Deny and explainApprovalt

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

KeyWhy
Ctrl+CStops a running reply and, pressed twice, quits. Always works.
Ctrl+DQuits from an empty prompt. Always works.
Ctrl+MThe 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:

KeyUsually taken by
Ctrl+ZThe 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+SpacemacOS 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.

MessageMeaning
keybindings.json is not valid JSON; using defaultsThe 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 reboundOne of the three keys you cannot take.
'…' bound to … but may be interceptedOne of the warned keys. The binding is applied.
nothing is bound to '…' in …, so there is nothing to unbindA null for a key that had no binding there.
'…' has an empty command: valuecommand: 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.