Files
pi/packages/coding-agent/docs/keybindings.md
T
Christian Klotzand1dustycy fd889a2741 fix(coding-agent,tui): paste Finder file paths instead of icons (#10136)
Read Finder file URLs before icon image data on macOS. Quote paths in
bash mode and reject terminal control characters before rendering.

Fixes #9999

Co-authored-by: 1dustycy <onedustycy@gmail.com>
2026-09-28 20:59:29 +01:00

10 KiB

Keybindings Reference

Pi exposes named actions, such as app.session.new, that can be assigned keybindings. You can change default assignments or bind unassigned actions in Pi's user configuration.

Run /hotkeys to see the active shortcuts for the main editor and application.

Assign keybindings

Create <agent-dir>/keybindings.json. The agent directory defaults to ~/.pi/agent and is described in Agent directory.

Map each action identifier to one key or a list of keys:

{
  "app.session.new": "ctrl+shift+n",
  "app.session.tree": ["ctrl+shift+t", "alt+shift+t"]
}

A configured value replaces the default for that action. Use an empty list to disable an action's keybindings:

{
  "tui.altScreen.pageUp": []
}

After editing the file, run /reload to apply the changes to the active session.

Key syntax

Write a key as modifier+key. Modifiers are ctrl, shift, alt, and super. You can combine modifiers. Valid 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: `, -, =, [, ], \, ;, ', ,, ., /, !, @, #, $, %, ^, &, *, (, ), _, +, |, ~, {, }, :, <, >, ?

Examples: ctrl+shift+x, alt+ctrl+x, ctrl+shift+alt+x, super+k, ctrl+super+k, and ctrl+1.

super bindings require a terminal that reports the modifier separately, typically through the Kitty keyboard protocol. They may not work in terminals without that support.

Actions

Terminal UI

Cursor movement

Keybinding id Default Description
tui.editor.cursorUp up Move cursor up, browsing older history at the top
tui.editor.cursorDown down Move cursor down, browsing newer history at the bottom
tui.editor.historyPrevious None Select the previous prompt history entry
tui.editor.historyNext None Select the next prompt history entry
tui.editor.cursorLeft left, ctrl+b Move cursor left
tui.editor.cursorRight right, ctrl+f Move cursor right
tui.editor.cursorWordLeft alt+left, ctrl+left, alt+b Move cursor word left
tui.editor.cursorWordRight alt+right, ctrl+right, alt+f Move cursor word right
tui.editor.cursorLineStart home, ctrl+home, ctrl+a Move to line start
tui.editor.cursorLineEnd end, ctrl+end, ctrl+e Move to line end
tui.editor.jumpForward ctrl+] Jump forward to character
tui.editor.jumpBackward ctrl+alt+] Jump backward to character
tui.editor.pageUp pageUp, ctrl+pageUp Scroll up by page
tui.editor.pageDown pageDown, ctrl+pageDown Scroll down by page

The dedicated history actions browse prompt history regardless of cursor position and take precedence over application actions using the same key.

Text editing

Keybinding id Default Description
tui.editor.deleteCharBackward backspace Delete character backward
tui.editor.deleteCharForward delete, ctrl+d Delete character forward
tui.editor.deleteWordBackward ctrl+w, alt+backspace Delete word backward
tui.editor.deleteWordForward alt+d, alt+delete Delete word forward
tui.editor.deleteToLineStart ctrl+u Delete to line start
tui.editor.deleteToLineEnd ctrl+k Delete to line end
tui.editor.yank ctrl+y Paste most recently deleted text
tui.editor.yankPop alt+y Cycle through deleted text after yank
tui.editor.undo ctrl+- (ctrl+z on Windows; alt+z on WSL) Undo last edit

Input and selection

Keybinding id Default Description
tui.input.newLine shift+enter, ctrl+j Insert new line
tui.input.submit enter Submit input
tui.input.tab tab Tab or autocomplete
tui.input.copy ctrl+c Copy selection
tui.select.up up Move selection up
tui.select.down down Move selection down
tui.select.pageUp pageUp Page up in list
tui.select.pageDown pageDown Page down in list
tui.select.confirm enter Confirm selection
tui.select.cancel escape, ctrl+c Cancel selection

Fullscreen

In fullscreen mode, these actions control the transcript and take precedence over editor actions using the same key.

Keybinding id Default Description
tui.altScreen.pageUp pageUp Scroll the transcript up by one page
tui.altScreen.pageDown pageDown Scroll the transcript down by one page
tui.altScreen.halfPageUp None Scroll the transcript up by half a page
tui.altScreen.halfPageDown None Scroll the transcript down by half a page
tui.altScreen.lineUp None Scroll the transcript up by one line
tui.altScreen.lineDown None Scroll the transcript down by one line
tui.altScreen.previousPrompt ctrl+shift+up, ctrl+up (ctrl+up only on Windows and WSL) Jump to the previous marked message
tui.altScreen.nextPrompt ctrl+shift+down, ctrl+down (ctrl+down only on Windows and WSL) Jump to the next marked message
tui.altScreen.search ctrl+shift+f (ctrl+f on Windows and WSL) Search the rendered transcript
tui.altScreen.searchNext enter, ctrl+g Select the next search match while searching
tui.altScreen.searchPrevious shift+enter, ctrl+shift+g Select the previous search match while searching
tui.altScreen.searchClose escape Close transcript search
tui.altScreen.top home Scroll to the beginning of the transcript
tui.altScreen.bottom end Scroll to the transcript end and follow new output

Application

Keybinding id Default Description
app.interrupt escape Cancel / abort
app.clear ctrl+c Clear editor (first) / exit (second)
app.exit ctrl+d Exit (when editor empty)
app.suspend ctrl+z (None on Windows) Suspend to background
app.editor.external ctrl+g Open in external editor (externalEditor, $VISUAL, $EDITOR, Notepad on Windows, or nano elsewhere)
app.clipboard.pasteImage ctrl+v (alt+v on Windows and WSL) Paste files on macOS, images, or text from clipboard

On native Windows, app.suspend has no default because Windows terminals do not support Unix job control. If you assign it manually, Pi shows a status message instead of suspending. WSL uses the normal ctrl+z and fg behavior.

Sessions

Keybinding id Default Description
app.session.new None Start a new session (/new)
app.session.tree None Open session tree navigator (/tree)
app.session.fork None Fork current session (/fork)
app.session.resume None Open session resume picker (/resume)
app.session.togglePath ctrl+p Toggle path display
app.session.toggleSort ctrl+s Toggle sort mode
app.session.toggleNamedFilter ctrl+n Toggle named-only filter
app.session.rename ctrl+r Rename session
app.session.delete ctrl+d Delete session
app.session.deleteNoninvasive ctrl+backspace Delete session when query is empty

Models and Thinking

Keybinding id Default Description
app.model.select ctrl+l Open model selector
app.model.cycleForward ctrl+p Cycle to next model
app.model.cycleBackward shift+ctrl+p (alt+p on Windows and WSL) Cycle to previous model
app.models.save ctrl+s Save the selected default model or scoped model configuration to settings
app.thinking.cycle shift+tab Cycle thinking level
app.thinking.save ctrl+s Save current thinking level to settings
app.thinking.toggle ctrl+t Collapse or expand thinking blocks

Display and Message Queue

Keybinding id Default Description
app.tools.expand ctrl+o Collapse or expand tool output
app.message.copy ctrl+x Copy the selected message in /tree; in fullscreen mode, copy the active selection when fullscreenCopyOnSelect is false; otherwise copy the last assistant message
app.message.followUp alt+enter (ctrl+q on Windows and WSL) Queue follow-up message
app.message.dequeue alt+up (alt+q on Windows and WSL) Restore queued messages to editor

Tree Navigation

Keybinding id Default Description
app.tree.foldOrUp ctrl+left, alt+left Fold current branch segment, or jump to the previous segment start
app.tree.unfoldOrDown ctrl+right, alt+right Unfold current branch segment, or jump to the next segment start or branch end
app.tree.editLabel shift+l Edit the label on the selected tree node
app.tree.toggleLabelTimestamp shift+t Toggle label timestamps in the tree
app.tree.filter.default ctrl+d Set tree filter to default view
app.tree.filter.noTools ctrl+t Toggle tree filter that hides tool results
app.tree.filter.userOnly ctrl+u Toggle tree filter that shows only user messages
app.tree.filter.labeledOnly ctrl+l Toggle tree filter that shows only labeled entries
app.tree.filter.all ctrl+a Toggle tree filter that shows all entries
app.tree.filter.cycleForward ctrl+o Cycle tree filter forward
app.tree.filter.cycleBackward shift+ctrl+o Cycle tree filter backward

Scoped Models Selector

Used inside the scoped models selector (opened via /scoped-models).

Keybinding id Default Description
app.models.enableAll ctrl+a Enable all models (or all matching the current search)
app.models.clearAll ctrl+x Clear all models (or all matching the current search)
app.models.toggleProvider ctrl+p Toggle all models for the current provider
app.models.reorderUp alt+up Move the selected model up in the cycle order
app.models.reorderDown alt+down Move the selected model down in the cycle order