跳转到内容

快捷键绑定

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

配置文件使用与 pi 内部一致、且扩展作者在 keyHint() 和注入的 keybindings 管理器中所使用的带命名空间的快捷键绑定 ID。

使用旧式未加命名空间 ID(如 cursorUpexpandTools)的旧配置会在启动时自动迁移为带命名空间的 ID。

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

modifier+key,其中修饰键为 ctrlshiftaltsuper(可组合),按键包括:

  • 字母: a-z
  • 数字: 0-9
  • 特殊键: escapeescenterreturntabspacebackspacedeleteinsertclearhomeendpageUppageDownupdownleftright
  • 功能键: f1-f12
  • 符号: `, -, =, [, ], \, ;, ', ,, ., /, !, @, #, $, %, ^, &, *, (, ), _, +, |, ~, {, }, :, <, >, ?

修饰键组合示例:ctrl+shift+xalt+ctrl+xctrl+shift+alt+xsuper+kctrl+super+kctrl+1 等。

super 绑定需要终端单独上报该修饰键,通常通过 Kitty 键盘协议实现。不支持该协议的终端可能无法使用这些绑定。

快捷键绑定 ID 默认绑定 说明
tui.editor.cursorUp up 向上移动光标,浏览顶部较早的历史记录
tui.editor.cursorDown down 向下移动光标,浏览底部较新的历史记录
tui.editor.historyPrevious (none) 选择上一条提示历史记录
tui.editor.historyNext (none) 选择下一条提示历史记录
tui.editor.cursorLeft left, ctrl+b 向左移动光标
tui.editor.cursorRight right, ctrl+f 向右移动光标
tui.editor.cursorWordLeft alt+left, ctrl+left, alt+b 向左移动一个单词
tui.editor.cursorWordRight alt+right, ctrl+right, alt+f 向右移动一个单词
tui.editor.cursorLineStart home, ctrl+home, ctrl+a 移动到行首
tui.editor.cursorLineEnd end, ctrl+end, ctrl+e 移动到行尾
tui.editor.jumpForward ctrl+] 向前跳转到字符
tui.editor.jumpBackward ctrl+alt+] 向后跳转到字符
tui.editor.pageUp pageUp, ctrl+pageUp 按页向上滚动
tui.editor.pageDown pageDown, ctrl+pageDown 按页向下滚动

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

快捷键绑定 ID 默认绑定 说明
tui.editor.deleteCharBackward backspace 向后删除字符
tui.editor.deleteCharForward delete, ctrl+d 向前删除字符
tui.editor.deleteWordBackward ctrl+w, alt+backspace 向后删除单词
tui.editor.deleteWordForward alt+d, alt+delete 向前删除单词
tui.editor.deleteToLineStart ctrl+u 删除到行首
tui.editor.deleteToLineEnd ctrl+k 删除到行尾
快捷键绑定 ID 默认绑定 说明
tui.input.newLine shift+enter, ctrl+j 插入换行
tui.input.submit enter 提交输入
tui.input.tab tab Tab / 自动补全
快捷键绑定 ID 默认绑定 说明
tui.editor.yank ctrl+y 粘贴最近删除的文本
tui.editor.yankPop alt+y 粘贴后循环切换已删除的文本
tui.editor.undo ctrl+- 撤销上次编辑
快捷键绑定 ID 默认绑定 说明
tui.input.copy ctrl+c 复制所选内容
tui.select.up up 向上移动选择
tui.select.down down 向下移动选择
tui.select.pageUp pageUp 列表中向上翻页
tui.select.pageDown pageDown 列表中向下翻页
tui.select.confirm enter 确认选择
tui.select.cancel escape, ctrl+c 取消选择

这些操作在交互模式使用 --tui-mode fullscreen 时生效,作用于主要的对话记录滚动区域。双指触控板与鼠标滚轮输入滚动指针下方的区域;当指针位于固定的编辑器/状态栏/底部停靠区时,则回退为滚动对话记录。点击 OSC 8 超链接会在默认处理程序中打开。按住主鼠标按钮拖动可选择文本并复制到剪贴板;在对话记录顶部或底部边缘持续按住会自动滚动到屏幕外内容。

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

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

这种路由仍可通过常规操作绑定进行配置。例如,将 "tui.altScreen.pageUp": "ctrl+pageUp" 绑定为 fullscreen 模式下让 pageUp 控制编辑器、ctrl+pageUp 控制对话记录。绑定 tui.altScreen.halfPageUptui.altScreen.halfPageDown 可在保留整页绑定的同时进行更小幅度的对话记录滚动。将 "tui.altScreen.pageUp": [] 设置为完全禁用该对话记录快捷键。用户绑定会替换该操作的默认绑定。

快捷键绑定 ID 默认绑定 说明
tui.altScreen.pageUp pageUp 将对话记录向上滚动一页
tui.altScreen.pageDown pageDown 将对话记录向下滚动一页
tui.altScreen.halfPageUp (none) 将对话记录向上滚动半页
tui.altScreen.halfPageDown (none) 将对话记录向下滚动半页
tui.altScreen.previousPrompt ctrl+shift+up 跳转到上一条已标记的消息
tui.altScreen.nextPrompt ctrl+shift+down 跳转到下一条已标记的消息
tui.altScreen.top home 滚动到对话记录开头
tui.altScreen.bottom end 滚动到对话记录末尾并跟随新输出
快捷键绑定 ID 默认绑定 说明
app.interrupt escape 取消 / 中止
app.clear ctrl+c 清空编辑器(第一次)/ 退出(第二次)
app.exit ctrl+d 退出(当编辑器为空时)
app.suspend ctrl+z(Windows 上无) 挂起到后台
app.editor.external ctrl+g 在外部编辑器中打开(externalEditor$VISUAL$EDITOR,Windows 下为记事本,其他平台为 nano
app.clipboard.pasteImage ctrl+v(Windows 上为 alt+v 从剪贴板粘贴图像或文本
快捷键绑定 ID 默认绑定 说明
app.session.new (none) 开始新会话(/new
app.session.tree (none) 打开会话树导航器(/tree
app.session.fork (none) 派生当前会话(/fork
app.session.resume (none) 打开会话恢复选择器(/resume
app.session.togglePath ctrl+p 切换路径显示
app.session.toggleSort ctrl+s 切换排序模式
app.session.toggleNamedFilter ctrl+n 切换仅命名过滤器
app.session.rename ctrl+r 重命名会话
app.session.delete ctrl+d 删除会话
app.session.deleteNoninvasive ctrl+backspace 查询为空时删除会话
快捷键绑定 ID 默认绑定 说明
app.model.select ctrl+l 打开模型选择器
app.model.cycleForward ctrl+p 循环到下一个模型
app.model.cycleBackward shift+ctrl+p 循环到上一个模型
app.thinking.cycle shift+tab 循环切换思考级别
app.thinking.toggle ctrl+t 折叠或展开思考块
快捷键绑定 ID 默认绑定 说明
app.tools.expand ctrl+o 折叠或展开工具输出
app.message.copy ctrl+x 复制最后一条助手消息,或 /tree 中选定的消息
app.message.followUp alt+enter 将后续消息加入队列
app.message.dequeue alt+up 将队列中的消息恢复至编辑器
快捷键绑定 ID 默认绑定 说明
app.tree.foldOrUp ctrl+left, alt+left 折叠当前分支段,或跳转到上一段开头
app.tree.unfoldOrDown ctrl+right, alt+right 展开当前分支段,或跳转到下一段开头或分支末尾
app.tree.editLabel shift+l 编辑选定树节点上的标签
app.tree.toggleLabelTimestamp shift+t 切换树中标签的时间戳显示
app.tree.filter.default ctrl+d 将树过滤器设置为默认视图
app.tree.filter.noTools ctrl+t 切换隐藏工具结果的树过滤器
app.tree.filter.userOnly ctrl+u 切换仅显示用户消息的树过滤器
app.tree.filter.labeledOnly ctrl+l 切换仅显示已标记条目的树过滤器
app.tree.filter.all ctrl+a 切换显示所有条目的树过滤器
app.tree.filter.cycleForward ctrl+o 向前循环切换树过滤器
app.tree.filter.cycleBackward shift+ctrl+o 向后循环切换树过滤器

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

快捷键绑定 ID 默认绑定 说明
app.models.save ctrl+s 将当前模型选择保存到设置
app.models.enableAll ctrl+a 启用所有模型(或所有匹配当前搜索的模型)
app.models.clearAll ctrl+x 清除所有模型(或所有匹配当前搜索的模型)
app.models.toggleProvider ctrl+p 切换当前模型提供方的所有模型
app.models.reorderUp alt+up 在循环顺序中将所选模型上移
app.models.reorderDown alt+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 行为仍然适用。

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