在终端中操作 AI 编程助手时,快捷键就是你的肌肉记忆。一个精心配置的快捷键方案,能让你的操作效率提升数倍。OpenCode 提供了极其灵活的快捷键自定义系统,从简单的单键绑定到多键组合,甚至支持 Leader 键和复合快捷键。
本文将深入解析 OpenCode 的 Keybinds 系统,带你从入门到精通,打造属于自己的高效编程工作流。
OpenCode 的快捷键配置存储在 tui.json 文件中,通过 keybinds 字段定义。与大多数终端工具不同,OpenCode 不会与终端的默认快捷键冲突——它通过 Leader 键 机制和丰富的绑定选项,让你在终端中畅快操作。
{
"$schema": "https://opencode.ai/tui.json",
"keybinds": {}
}
schema 字段是可选的,但强烈建议添加——主流编辑器会自动补全和校验配置项。
OpenCode 最聪明的设计之一就是 Leader 键。默认情况下,Ctrl+X 是 Leader 键,按下后进入等待模式,再按第二个键触发对应操作。
例如,新建会话的默认快捷键是 <leader>n——先按 Ctrl+X,再按 n。
{
"$schema": "https://opencode.ai/tui.json",
"leader_timeout": 2000,
"keybinds": {
"leader": "ctrl+x"
}
}
leader_timeout 控制按下 Leader 键后的等待时间,默认 2000 毫秒。如果超过这个时间没有按下第二个键,Leader 模式自动退出。
你可以把 Leader 键换成任何你喜欢的组合键,比如 Ctrl+Space 或 Ctrl+\:
{
"keybinds": {
"leader": "ctrl+space"
}
}
选择 Leader 键的关键是:不要与终端模拟器或 shell 的常用快捷键冲突。Ctrl+X 是个不错的默认值,因为它很少被其他程序占用。
OpenCode 的绑定语法非常灵活,支持四种形式的绑定:
最简单的形式,直接绑定一个快捷键:
{
"keybinds": {
"command_list": "ctrl+p"
}
}
用逗号分隔多个快捷键,任一组合都可触发操作:
{
"keybinds": {
"app_exit": "ctrl+c,ctrl+d,<leader>q"
}
}
数组也能实现多键绑定,等价于逗号分隔的字符串:
{
"keybinds": {
"messages_copy": ["<leader>y", "ctrl+shift+c"]
}
}
当需要控制键盘事件的默认行为时,使用对象形式:
{
"keybinds": {
"input_paste": {
"key": "ctrl+v",
"preventDefault": false
}
}
}
preventDefault 控制是否阻止终端默认行为。设置为 false 可以让 Ctrl+V 同时触发粘贴和终端默认行为,这在某些场景下非常有用。
如果你不需要某个快捷键,直接设为 "none" 或 false:
{
"keybinds": {
"session_compact": "none",
"app_toggle_animations": false
}
}
这在你不小心触发了某个不想要的操作时特别有用。
OpenCode 有几十个可配置的快捷键,按功能可分为以下几大类:
会话是 OpenCode 的核心概念,掌握这些快捷键可以让你在多任务之间快速切换:
{
"keybinds": {
"session_new": "<leader>n",
"session_list": "<leader>l",
"session_timeline": "<leader>g",
"session_rename": "ctrl+r",
"session_delete": "ctrl+d",
"session_interrupt": "escape",
"session_compact": "<leader>c",
"session_fork": "none",
"session_share": "none"
}
}
session_new 新建会话,session_list 列出所有会话session_timeline 打开时间线视图,方便查看操作历史session_interrupt 中断当前 AI 响应,默认为 Escape 键session_compact 压缩当前会话上下文,释放 token 空间当使用子代理时,这些快捷键让你在父子代理之间快速跳转:
{
"keybinds": {
"session_child_first": "<leader>down",
"session_child_cycle": "right",
"session_child_cycle_reverse": "left",
"session_parent": "up"
}
}
注意这些快捷键默认没有使用 Leader 键,因为导航需要快速响应。你可以把它们改成 Vim 风格的方向键映射:
{
"keybinds": {
"session_child_cycle": "ctrl+j",
"session_child_cycle_reverse": "ctrl+k",
"session_parent": "ctrl+h"
}
}
控制消息历史和输出显示:
{
"keybinds": {
"messages_page_up": "pageup,ctrl+alt+b",
"messages_page_down": "pagedown,ctrl+alt+f",
"messages_line_up": "ctrl+alt+y",
"messages_line_down": "ctrl+alt+e",
"messages_first": "ctrl+g,home",
"messages_last": "ctrl+alt+g,end",
"messages_copy": "<leader>y",
"messages_undo": "<leader>u",
"messages_redo": "<leader>r",
"messages_toggle_conceal": "<leader>h"
}
}
messages_undo 和 messages_redo 是最实用的功能——撤销 AI 的上一步操作,就像在编辑器中按 Ctrl+Z 一样自然。
messages_toggle_conceal 可以切换显示/隐藏工具调用细节,当你只需要看最终结果时非常有用。
在多个模型之间快速切换:
{
"keybinds": {
"model_provider_list": "ctrl+a",
"model_favorite_toggle": "ctrl+f",
"model_list": "<leader>m",
"model_cycle_recent": "f2",
"model_cycle_recent_reverse": "shift+f2",
"model_cycle_favorite": "none",
"model_cycle_favorite_reverse": "none"
}
}
model_cycle_recent(默认 F2)可以在最近使用的模型间循环切换。如果你经常在不同模型之间对比输出,这是最高效的方式。
输入框的编辑快捷键数量最多,也最值得自定义:
{
"keybinds": {
"input_submit": "return",
"input_newline": "shift+return,ctrl+return,alt+return,ctrl+j",
"input_clear": "ctrl+c",
"input_undo": "ctrl+-,super+z",
"input_redo": "ctrl+.,super+shift+z",
"input_delete_line": "ctrl+shift+d",
"input_delete_to_line_end": "ctrl+k",
"input_delete_to_line_start": "ctrl+u",
"input_delete_word_forward": "alt+d,alt+delete,ctrl+delete",
"input_delete_word_backward": "ctrl+w,ctrl+backspace,alt+backspace",
"input_select_all": "super+a"
}
}
在 Windows 上,input_undo 默认增加了 ctrl+z 绑定(因为 Windows 终端不支持 POSIX 挂起),而 terminal_suspend 被强制设为 none。
值得一提的是桌面版的提示输入框内置了 Readline/Emacs 风格的快捷键:
| 快捷键 | 操作 |
|--------|------|
| Ctrl+A | 移动到行首 |
| Ctrl+E | 移动到行尾 |
| Ctrl+B / Ctrl+F | 向后/向前移动一个字符 |
| Alt+B / Alt+F | 向后/向前移动一个单词 |
| Ctrl+D | 删除光标下字符 |
| Ctrl+K | 删除到行尾 |
| Ctrl+U | 删除到行首 |
| Ctrl+W | 删除前一个单词 |
| Alt+D | 删除后一个单词 |
| Ctrl+T | 交换字符 |
| Ctrl+G | 取消弹窗/中止响应 |
这些是内置的,不需要配置。
{
"keybinds": {
"sidebar_toggle": "<leader>b",
"scrollbar_toggle": "none",
"status_view": "<leader>s",
"theme_list": "<leader>t",
"theme_switch_mode": "none",
"app_toggle_animations": "none",
"app_toggle_file_context": "none",
"app_toggle_diffwrap": "none"
}
}
sidebar_toggle 打开/关闭侧边栏,status_view 查看状态信息,theme_list 快速切换主题——这些是日常使用频率很高的操作。
{
"keybinds": {
"dialog.select.prev": "up,ctrl+p",
"dialog.select.next": "down,ctrl+n",
"dialog.select.submit": "return",
"dialog.prompt.submit": "return",
"dialog.mcp.toggle": "space"
}
}
对话框快捷键采用 Vim 风格设计,Ctrl+P / Ctrl+N 上下选择,Space 切换 MCP 服务器。
OpenCode 内置了一个快捷键帮助系统——Which Key。按下 Ctrl+Alt+K 即可查看当前可用的所有快捷键:
{
"keybinds": {
"which_key_toggle": "ctrl+alt+k",
"which_key_layout_toggle": "ctrl+alt+shift+k",
"which_key_pending_toggle": "ctrl+alt+shift+p",
"which_key_group_previous": "ctrl+alt+left,ctrl+alt+[",
"which_key_group_next": "ctrl+alt+right,ctrl+alt+]",
"which_key_scroll_up": "ctrl+alt+up,ctrl+alt+p",
"which_key_scroll_down": "ctrl+alt+down,ctrl+alt+n"
}
}
建议把 which_key_toggle 绑定到一个容易按的组合键上——它是探索和学习快捷键的最佳入口。
下面提供几种不同风格的配置文件,你可以直接参考使用。
如果你刚接触 OpenCode,只改几个最常用的快捷键就够了:
{
"$schema": "https://opencode.ai/tui.json",
"keybinds": {
"command_list": "ctrl+p",
"model_cycle_recent": "f2",
"model_cycle_recent_reverse": "shift+f2",
"session_interrupt": "escape",
"input_undo": "ctrl+z",
"input_redo": "ctrl+y"
}
}
如果你习惯 Vim 的操作方式,可以把导航键改成 hjkl:
{
"$schema": "https://opencode.ai/tui.json",
"keybinds": {
"session_child_cycle": "ctrl+j",
"session_child_cycle_reverse": "ctrl+k",
"session_child_first": "ctrl+l",
"session_parent": "ctrl+h",
"messages_line_up": "ctrl+alt+k",
"messages_line_down": "ctrl+alt+j",
"messages_page_up": "ctrl+alt+b",
"messages_page_down": "ctrl+alt+f"
}
}
面向重度用户,把所有高频操作都安排在最顺手的位置:
{
"$schema": "https://opencode.ai/tui.json",
"leader_timeout": 1500,
"keybinds": {
"leader": "ctrl+space",
"session_new": "<leader>n",
"session_list": "<leader>l",
"session_timeline": "<leader>g",
"session_delete": "<leader>d",
"session_rename": "<leader>r",
"session_share": "<leader>s",
"messages_undo": "<leader>u",
"messages_redo": "<leader>y",
"messages_copy": "<leader>c",
"model_cycle_recent": "f2",
"model_cycle_recent_reverse": "shift+f2",
"model_list": "<leader>m",
"sidebar_toggle": "<leader>b",
"theme_list": "<leader>t",
"command_list": "ctrl+p",
"input_undo": "ctrl+z",
"input_redo": "ctrl+y",
"input_clear": "ctrl+shift+c",
"input_delete_word_backward": "ctrl+backspace",
"input_delete_word_forward": "ctrl+delete",
"which_key_toggle": "ctrl+alt+k"
}
}
有些终端默认不发送 Shift+Enter 的修饰键信号。如果你的 Shift+Enter 无法换行,需要配置终端。
打开 Windows Terminal 的 settings.json:
%LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json
在根级 actions 数组中添加:
{
"command": {
"action": "sendInput",
"input": "\u001b[13;2u"
},
"id": "User.sendInput.ShiftEnterCustom"
}
在根级 keybindings 数组中添加:
{
"keys": "shift+enter",
"id": "User.sendInput.ShiftEnterCustom"
}
保存后重启终端即可。
在 iTerm2 中,进入 Preferences > Profiles > Keys,添加一个新的快捷键:
Shift+EnterSend Escape Sequence[13;2u配置完快捷键后,可以使用以下命令验证配置是否生效:
opencode debug config
这会输出 OpenCode 当前加载的所有配置,包括合并后的快捷键设置。如果你想确认某个快捷键是否被正确识别,可以查看其中的 keybinds 部分。
选择合适的 Leader 键:确保不与终端的常用快捷键冲突,Ctrl+X 和 Ctrl+Space 是安全的选择。
减少 Leader 超时时间:如果你操作熟练,可以把 leader_timeout 从 2000ms 降到 1000ms,响应更迅速。
善用 F2 切换模型:在多个模型之间对比输出是日常高频操作,把 model_cycle_recent 绑定到顺手的位置。
消息撤销是你的后悔药:用 messages_undo 回退 AI 操作,避免误改代码后的手动恢复。
Which Key 是学习入口:按 Ctrl+Alt+K 可以随时查看所有可用快捷键,这是最快的学习方式。
只改你需要的:keybinds 会与默认值合并,你只需要配置要更改的项。
在 Git 仓库中管理配置:把 tui.json 提交到仓库,团队成员可以直接共享一套快捷键方案。
OpenCode 的快捷键系统设计非常灵活,从基本的单键绑定到 Leader 键复合快捷键,从禁用不需要的操作到精细的键盘事件控制,覆盖了终端交互的各种场景。花一点时间配置好快捷键,就能在日常使用中节省大量时间。
记住,快捷键配置没有标准答案——最适合你的工作习惯的,就是最好的方案。打开 .config/opencode/tui.json,开始定制你的专属工作流吧。