Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Keybindings

Run /hotkeys inside an veyyon session to see the active chords for your current build. The list reflects any remaps loaded from disk and any bindings added by extensions.

Customize keybindings

User remaps live in ~/.veyyon/profiles/default/agent/keybindings.yml (or the active profile’s agent dir). The file is a YAML mapping whose keys are keybinding action IDs and whose values are either one chord string or an array of chord strings. It is not read from config.yml, and there is no nested keybindings object. Legacy keybindings.json is migrated to keybindings.yml on load.

app.model.cycleForward: Ctrl+P
app.model.selectTemporary: Alt+P
app.plan.toggle: Alt+Shift+P

Chord names are case-insensitive and use the same notation shown in the UI, such as Ctrl+P, Alt+Shift+P, Shift+Enter, and Ctrl+Backspace.

Set an action to an empty array to disable it:

app.history.search: []

Common action IDs

Action IDDefaultMeaning
app.model.cycleForwardCtrl+PCycle role models forward
app.model.cycleBackwardShift+Ctrl+PCycle role models backward
app.model.selectTemporaryAlt+PPick a model temporarily for this session
app.model.selectAlt+MOpen the model selector and set roles
app.plan.toggleAlt+Shift+PToggle plan mode
app.history.searchCtrl+RSearch prompt history
app.tools.expandCtrl+OToggle tool-output expansion
app.thinking.toggleCtrl+TToggle thinking-block visibility
app.thinking.cycleShift+TabCycle thinking level
app.editor.externalCtrl+GEdit the draft in $VISUAL / $EDITOR
app.message.followUpCtrl+Q, Ctrl+EnterQueue a follow-up message
app.message.dequeueAlt+UpDequeue a queued message back into the editor
app.retryAlt+RRetry the last failed assistant turn
app.display.resetCtrl+LReset terminal display
app.bash.backgroundCtrl+BMove the running foreground command to a background job. Active only while a foreground bash call is waiting; the composer’s shortcut band shows a ctrl+b background chip then. Otherwise the chord keeps its readline meaning (cursor left)
app.clipboard.copyLineAlt+Shift+LCopy the current line
app.clipboard.copyPromptAlt+Shift+CCopy the whole prompt
app.clipboard.pasteImageCtrl+V (Alt+V fallback on Windows, Super+V on macOS)Paste from the clipboard (image preferred, text fallback)
app.stt.toggleUnbound (hold Space)Toggle speech-to-text. By default there is no key chord, hold the space bar to record (push-to-talk) and release to transcribe; bind a chord here for a press-to-toggle alternative

On Windows Terminal, Ctrl+V may be handled by the terminal paste command before veyyon sees it; use the Alt+V fallback when clipboard image paste appears to do nothing. When the clipboard holds no image, app.clipboard.pasteImage pastes the clipboard text instead, so hosts that deliver only this chord (VS Code’s integrated terminal when configured to forward Ctrl+V, Windows clipboard history via Win+V) work for both payload kinds. Windows Terminal also swallows Ctrl+Enter, so the app.message.followUp chord also binds Ctrl+Q, the same chord GitHub Copilot CLI uses, and the same chord submits the agent dashboard’s new-agent description and hook-editor prompts. If your existing keybindings.yml already assigns Ctrl+Q to another action, that user remap wins and follow-up keeps Ctrl+Enter unless you explicitly bind app.message.followUp.

Terminals that implement OSC 5522 enhanced paste can send clipboard MIME data directly to veyyon; image pastes are attached as [Image #N], while text/plain paste events keep normal paste behavior. When OSC 5522 is unavailable, bracketed paste still handles text, and a pasted single image-file path is loaded as an image when the file is readable from the veyyon host.

Older unqualified action names are migrated when keybindings.yml is loaded, but new docs and new configs should use the namespaced action IDs above. Existing keybindings.json files are still accepted and migrated to keybindings.yml; keybindings.yaml is also accepted.

Status-line affordances

A few arrow gestures act on the status line when the composer is empty. They are fixed input gestures, not remappable action IDs, so they are not in the table above.

GestureWhenEffect
Down arrowA goal is active or pausedOpen the goal detail menu (same as /goal): objective, tokens against budget, completed turns, time spent, and pause/resume/adjust-budget/drop
Double-tap ← (left)Composer emptyOpen the subagent dashboard, or return a focused subagent view to the main session