跳转到主要内容

8 快捷键

自定义 pi 的全部键盘快捷键:按键格式、动作清单与 Emacs/Vim 配置示例。

所有键盘快捷键都可以通过 ~/.pi/agent/keybindings.json 自定义。每个动作可以绑定一个或多个按键。

该配置文件使用与 pi 内部以及扩展作者在 keyHint() 和注入的 keybindings 管理器中相同的带命名空间快捷键 ID。

使用 cursorUp 或 expandTools 等旧版无命名空间 ID 的配置会在启动时自动迁移为带命名空间的 ID。

编辑 keybindings.json 后,在 pi 中运行 /reload 即可应用更改,无需重启会话。

按键格式

格式为 modifier+key,其中修饰键为 ctrl、shift、alt、super(可组合),按键包括:

  • 字母: a-z
  • 数字: 0-9
  • 特殊键: escape、esc、enter、return、tab、space、backspace、delete、insert、clear、home、end、pageUp、pageDown、up、down、left、right
  • 功能键: f1-f12
  • 符号: `、-、=、[、]、\、;、'、,、.、/、!、@、#、$、%、^、&、*、(、)、_、+、|、~、{、}、:、<、>、?

修饰键组合:ctrl+shift+x、alt+ctrl+x、ctrl+shift+alt+x、super+k、ctrl+super+k、ctrl+1 等。

super 绑定要求终端能够单独上报该修饰键,通常需要 Kitty 键盘协议。在不支持的终端中可能无法工作。

全部动作

TUI 编辑器光标移动

快捷键 ID默认值说明
tui.editor.cursorUpup光标上移,到达顶部后浏览更早的历史
tui.editor.cursorDowndown光标下移,到达底部后浏览更新的历史
tui.editor.historyPrevious(无)选择上一条提示词历史
tui.editor.historyNext(无)选择下一条提示词历史
tui.editor.cursorLeftleft、ctrl+b光标左移
tui.editor.cursorRightright、ctrl+f光标右移
tui.editor.cursorWordLeftalt+left、ctrl+left、alt+b光标左移一个单词
tui.editor.cursorWordRightalt+right、ctrl+right、alt+f光标右移一个单词
tui.editor.cursorLineStarthome、ctrl+home、ctrl+a移动到行首
tui.editor.cursorLineEndend、ctrl+end、ctrl+e移动到行尾
tui.editor.jumpForwardctrl+]向前跳转到指定字符
tui.editor.jumpBackwardctrl+alt+]向后跳转到指定字符
tui.editor.pageUppageUp、ctrl+pageUp向上翻页
tui.editor.pageDownpageDown、ctrl+pageDown向下翻页

专用的历史动作始终切换历史条目,与多行提示词中的光标位置无关。当主编辑器获得焦点时,显式的历史绑定优先于应用动作,因此将 tui.editor.historyPrevious 绑定到 ctrl+p 只会在该上下文中覆盖模型循环切换,而不会改变选择器中的 Ctrl+P。

TUI 编辑器删除

快捷键 ID默认值说明
tui.editor.deleteCharBackwardbackspace向后删除一个字符
tui.editor.deleteCharForwarddelete、ctrl+d向前删除一个字符
tui.editor.deleteWordBackwardctrl+w、alt+backspace向后删除一个单词
tui.editor.deleteWordForwardalt+d、alt+delete向前删除一个单词
tui.editor.deleteToLineStartctrl+u删除到行首
tui.editor.deleteToLineEndctrl+k删除到行尾

TUI 输入

快捷键 ID默认值说明
tui.input.newLineshift+enter、ctrl+j插入新行
tui.input.submitenter提交输入
tui.input.tabtabTab / 自动补全

TUI 剪切环

快捷键 ID默认值说明
tui.editor.yankctrl+y粘贴最近删除的文本
tui.editor.yankPopalt+y在粘贴后循环切换已删除的文本
tui.editor.undoctrl+-(Windows 上为 ctrl+z;WSL 上为 alt+z)撤销上次编辑

TUI 剪贴板与选择

快捷键 ID默认值说明
tui.input.copyctrl+c复制选区
tui.select.upup选区上移
tui.select.downdown选区下移
tui.select.pageUppageUp列表中向上翻页
tui.select.pageDownpageDown列表中向下翻页
tui.select.confirmenter确认选择
tui.select.cancelescape、ctrl+c取消选择

TUI 全屏视口

这些动作在交互模式使用 --tui-mode fullscreen 时生效,作用于主对话记录滚动区域。双指触控板和鼠标滚轮输入会滚动指针所在区域;当指针位于固定的编辑器/状态栏/底部栏停靠区上时,则回退为滚动对话记录。点击 OSC 8 超链接会用默认处理器打开它。按住主鼠标键拖动会选择文本并复制到剪贴板;在对话记录的上、下边缘按住不动时会自动滚动到屏幕外的内容。对话记录向上滚动时,其底部行会显示可点击的 “Jump to latest message” 标签,展示 tui.altScreen.bottom 快捷键。各终端专属的鼠标与触控行为参见终端设置。

全屏对话记录绑定优先于编辑器绑定。因此在全屏模式下,默认的无修饰导航键控制对话记录,而它们的 ctrl 变体继续控制编辑器。在非全屏模式下,两种变体都控制编辑器。

对话记录搜索面板会显示已配置的上一个/下一个快捷键以及可点击的箭头控件。再次按下 tui.altScreen.search,或使用 tui.altScreen.searchClose,即可关闭它。

按键默认模式全屏模式
home、end编辑器对话记录
ctrl+home、ctrl+end编辑器编辑器
pageUp、pageDown编辑器对话记录
ctrl+pageUp、ctrl+pageDown编辑器编辑器

这一路由仍可通过常规的动作绑定进行配置。例如,"tui.altScreen.pageUp": "ctrl+pageUp" 会让全屏模式下的 pageUp 控制编辑器、ctrl+pageUp 控制对话记录。绑定 tui.altScreen.halfPageUp 和 tui.altScreen.halfPageDown 可以按半页步进,绑定 tui.altScreen.lineUp 和 tui.altScreen.lineDown 可以按单行步进。设置 "tui.altScreen.pageUp": [] 会完全禁用该对话记录快捷键。用户绑定会替换该动作的默认值。

快捷键 ID默认值说明
tui.altScreen.pageUppageUp将对话记录向上滚动一页
tui.altScreen.pageDownpageDown将对话记录向下滚动一页
tui.altScreen.halfPageUp(无)将对话记录向上滚动半页
tui.altScreen.halfPageDown(无)将对话记录向下滚动半页
tui.altScreen.lineUp(无)将对话记录向上滚动一行
tui.altScreen.lineDown(无)将对话记录向下滚动一行
tui.altScreen.previousPromptctrl+shift+up、ctrl+up(Windows 和 WSL 上仅为 ctrl+up)跳转到上一个标记消息
tui.altScreen.nextPromptctrl+shift+down、ctrl+down(Windows 和 WSL 上仅为 ctrl+down)跳转到下一个标记消息
tui.altScreen.searchctrl+shift+f(Windows 和 WSL 上为 ctrl+f)搜索渲染后的对话记录
tui.altScreen.searchNextenter、ctrl+g搜索时选择下一个匹配项
tui.altScreen.searchPreviousshift+enter、ctrl+shift+g搜索时选择上一个匹配项
tui.altScreen.searchCloseescape关闭对话记录搜索
tui.altScreen.tophome滚动到对话记录开头
tui.altScreen.bottomend滚动到对话记录末尾并跟随新输出

应用

快捷键 ID默认值说明
app.interruptescape取消 / 中止
app.clearctrl+c清空编辑器(第一次)/ 退出(第二次)
app.exitctrl+d退出(编辑器为空时)
app.suspendctrl+z(Windows 上无)挂起到后台
app.editor.externalctrl+g在外部编辑器中打开(externalEditor、$VISUAL、$EDITOR、Windows 上的记事本或其他平台上的 nano)
app.clipboard.pasteImagectrl+v(Windows 和 WSL 上为 alt+v)从剪贴板粘贴图片或文本

会话

快捷键 ID默认值说明
app.session.new(无)开始新会话(/new)
app.session.tree(无)打开会话树导航器(/tree)
app.session.fork(无)分叉当前会话(/fork)
app.session.resume(无)打开会话恢复选择器(/resume)
app.session.togglePathctrl+p切换路径显示
app.session.toggleSortctrl+s切换排序方式
app.session.toggleNamedFilterctrl+n切换"仅已命名"过滤器
app.session.renamectrl+r重命名会话
app.session.deletectrl+d删除会话
app.session.deleteNoninvasivectrl+backspace查询为空时删除会话

模型与思考

快捷键 ID默认值说明
app.model.selectctrl+l打开模型选择器
app.model.cycleForwardctrl+p循环切换到下一个模型
app.model.cycleBackwardshift+ctrl+p(Windows 和 WSL 上为 alt+p)循环切换到上一个模型
app.models.savectrl+s将选定的默认模型或范围模型配置保存到设置
app.thinking.cycleshift+tab循环切换思考级别
app.thinking.savectrl+s将当前思考级别保存到设置
app.thinking.togglectrl+t折叠或展开思考块

显示与消息队列

快捷键 ID默认值说明
app.tools.expandctrl+o折叠或展开工具输出
app.message.copyctrl+x在 /tree 中复制选中的消息;否则复制上一条助手消息;当 fullscreenCopyOnSelect 禁用时,复制全屏模式下活动的文本选区
app.message.followUpalt+enter(Windows 和 WSL 上为 ctrl+q)将后续消息加入队列
app.message.dequeuealt+up(Windows 和 WSL 上为 alt+q)将排队消息恢复到编辑器

树状导航

快捷键 ID默认值说明
app.tree.foldOrUpctrl+left、alt+left折叠当前分支段,或跳转到上一段起点
app.tree.unfoldOrDownctrl+right、alt+right展开当前分支段,或跳转到下一段起点或分支末尾
app.tree.editLabelshift+l编辑所选树节点的标签
app.tree.toggleLabelTimestampshift+t切换树中标签时间戳的显示
app.tree.filter.defaultctrl+d将树过滤器设为默认视图
app.tree.filter.noToolsctrl+t切换隐藏工具结果的树过滤器
app.tree.filter.userOnlyctrl+u切换仅显示用户消息的树过滤器
app.tree.filter.labeledOnlyctrl+l切换仅显示已标记条目的树过滤器
app.tree.filter.allctrl+a切换显示所有条目的树过滤器
app.tree.filter.cycleForwardctrl+o向前循环切换树过滤器
app.tree.filter.cycleBackwardshift+ctrl+o向后循环切换树过滤器

作用域模型选择器

用于作用域模型选择器内部(通过 /scoped-models 打开)。

快捷键 ID默认值说明
app.models.enableAllctrl+a启用所有模型(或当前搜索匹配的所有模型)
app.models.clearAllctrl+x清除所有模型(或当前搜索匹配的所有模型)
app.models.toggleProviderctrl+p切换当前提供商的所有模型
app.models.reorderUpalt+up在循环顺序中将所选模型上移
app.models.reorderDownalt+down在循环顺序中将所选模型下移

自定义配置

创建 ~/.pi/agent/keybindings.json:

{
  "tui.editor.historyPrevious": "ctrl+p",
  "tui.editor.historyNext": "ctrl+n",
  "tui.editor.deleteWordBackward": ["ctrl+w", "alt+backspace"]
}

每个动作可以绑定单个按键或一个按键数组。用户配置会覆盖默认值。

在原生 Windows 上,app.suspend 没有默认绑定,因为 Windows 终端不支持 Unix 作业控制。如果你手动绑定它,pi 会显示一条状态消息而不是挂起进程。在 WSL 中,正常的 Linux ctrl+z/fg 行为仍然适用。

Emacs 示例

{
  "tui.editor.historyPrevious": "ctrl+p",
  "tui.editor.historyNext": "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 示例

{
  "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"]
}