Files
oh-my-pi/docs/keybindings.md
T
roboomp b91b6aa0da fix(coding-agent): submit /agents create form and hook editor on Ctrl+Q
Windows Terminal does not deliver a distinct Ctrl+Enter event, so the agent
dashboard's new-agent description form (`AgentDashboard#handleInput` in
the `createInput` branch) and the hook editor's hook-style mode
(`HookEditorComponent#handleHookStyleInput`) could not be submitted: both
branches only matched Ctrl+Enter encodings, and the user-reported Ctrl+Enter
press registers as plain \r — same as Enter — so it fell straight through to
the newline branch. Fix #1903 already added Ctrl+Q as the Windows-friendly
default for `app.message.followUp`, but the create form and hook editor
hardcoded their own Ctrl+Enter check that bypassed that keybinding.

Routes both submit checks through a new `matchesAppFollowUp` helper that
delegates to `app.message.followUp`, falling back to a Ctrl+Q/Ctrl+Enter
literal match for component tests that don't install the app keybindings
manager. Updated hint text in both components to surface Ctrl+Q alongside
Ctrl+Enter. Added regression tests asserting Ctrl+Q submits after typing a
multi-line description (the exact Windows Terminal scenario).

Fixes #2118
2026-06-08 20:42:50 +00:00

4.3 KiB

Keybindings

Run /hotkeys inside an omp 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 ~/.omp/agent/keybindings.yml. 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 ~/.omp/agent/config.yml, and there is no nested keybindings object.

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.stt.toggle: []

Common action IDs

Action ID Default Meaning
app.model.cycleForward Ctrl+P Cycle role models forward
app.model.cycleBackward Shift+Ctrl+P Cycle role models in temporary mode
app.model.selectTemporary Alt+P Pick a model temporarily for this session
app.model.select Alt+M Open the model selector and set roles
app.plan.toggle Alt+Shift+P Toggle plan mode
app.history.search Ctrl+R Search prompt history
app.tools.expand Ctrl+O Toggle tool-output expansion
app.thinking.toggle Ctrl+T Toggle thinking-block visibility
app.thinking.cycle Shift+Tab Cycle thinking level
app.editor.external Ctrl+G Edit the draft in $VISUAL / $EDITOR
app.message.followUp Ctrl+Q, Ctrl+Enter Queue a follow-up message
app.message.dequeue Alt+Up Dequeue a queued message back into the editor
app.display.reset Ctrl+L Reset terminal display
app.clipboard.copyLine Alt+Shift+L Copy the current line
app.clipboard.copyPrompt Alt+Shift+C Copy the whole prompt
app.clipboard.pasteImage Ctrl+V (Alt+V fallback on Windows) Paste an image from the clipboard
app.stt.toggle Alt+H Toggle speech-to-text recording

On Windows Terminal, Ctrl+V may be handled by the terminal paste command before omp sees it; use the Alt+V fallback when clipboard image paste appears to do nothing. 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 omp; 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 omp 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.