Keybindings
All keyboard shortcuts can be customized via ~/.pi/agent/keybindings.json. Each action can be bound to one or more keys.
The config file uses the same namespaced keybinding ids that pi uses internally and that extension authors use in keyHint() and injected keybindings managers.
Older configs using pre-namespaced ids such as cursorUp or expandTools are migrated automatically to the namespaced ids on startup.
After editing keybindings.json, run /reload in pi to apply the changes without restarting the session.
Key Format
modifier+key where modifiers are ctrl, shift, alt (combinable) and 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:
`, -, =, [, ], \, ;, ', ,, ., /, !, @, #, $, %, ^, &, *, (, ), _, +, |, ~, {, }, :, <, >, ?
Modifier combinations: ctrl+shift+x, alt+ctrl+x, ctrl+shift+alt+x, ctrl+1, etc.
All Actions
TUI Editor Cursor Movement
| Keybinding id |
Default |
Description |
tui.editor.cursorUp |
up |
Move cursor up |
tui.editor.cursorDown |
down |
Move cursor down |
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+a |
Move to line start |
tui.editor.cursorLineEnd |
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 |
Scroll up by page |
tui.editor.pageDown |
pageDown |
Scroll down by page |
TUI Editor Deletion
| 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 Input
| Keybinding id |
Default |
Description |
tui.input.newLine |
shift+enter |
Insert new line |
tui.input.submit |
enter |
Submit input |
tui.input.tab |
tab |
Tab / autocomplete |
TUI Kill Ring
| Keybinding id |
Default |
Description |
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+- |
Undo last edit |
TUI Clipboard and Selection
| Keybinding id |
Default |
Description |
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 |
Application
| Keybinding id |
Default |
Description |
app.interrupt |
escape |
Cancel / abort |
app.clear |
ctrl+c |
Clear editor |
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 ($VISUAL or $EDITOR) |
app.clipboard.pasteImage |
ctrl+v (alt+v on Windows) |
Paste image from clipboard |
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 |
Cycle to previous model |
app.thinking.cycle |
shift+tab |
Cycle thinking level |
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.followUp |
alt+enter |
Queue follow-up message |
app.message.dequeue |
alt+up |
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 |
Custom Configuration
Create ~/.pi/agent/keybindings.json:
{
"tui.editor.cursorUp": ["up", "ctrl+p"],
"tui.editor.cursorDown": ["down", "ctrl+n"],
"tui.editor.deleteWordBackward": ["ctrl+w", "alt+backspace"]
}
Each action can have a single key or an array of keys. User config overrides defaults.
On native Windows, app.suspend has no default binding because Windows terminals do not support Unix job control. If you bind it manually, pi shows a status message instead of suspending. In WSL, the normal Linux ctrl+z/fg behavior still applies.
Emacs Example
{
"tui.editor.cursorUp": ["up", "ctrl+p"],
"tui.editor.cursorDown": ["down", "ctrl+n"],
"tui.editor.cursorLeft": ["left", "ctrl+b"],
"tui.editor.cursorRight": ["right", "ctrl+f"],
"tui.editor.cursorWordLeft": ["alt+left", "alt+b"],
"tui.editor.cursorWordRight": ["alt+right", "alt+f"],
"tui.editor.deleteCharForward": ["delete", "ctrl+d"],
"tui.editor.deleteCharBackward": ["backspace", "ctrl+h"],
"tui.input.newLine": ["shift+enter", "ctrl+j"]
}
Vim Example
{
"tui.editor.cursorUp": ["up", "alt+k"],
"tui.editor.cursorDown": ["down", "alt+j"],
"tui.editor.cursorLeft": ["left", "alt+h"],
"tui.editor.cursorRight": ["right", "alt+l"],
"tui.editor.cursorWordLeft": ["alt+left", "alt+b"],
"tui.editor.cursorWordRight": ["alt+right", "alt+w"]
}