OpenCode 快捷键配置详解
OpenCode 提供了一套完整的键盘快捷键系统,涵盖应用控制、会话管理、消息浏览、模型切换和输入编辑等各类操作。
所有快捷键均可通过 tui.json 文件进行自定义。
配置文件
快捷键配置写在 tui.json 文件的 keybinds 字段下,每条记录的键名为操作名称,值为对应的快捷键:
实例
"$schema": "https://opencode.ai/tui.json",
"keybinds": {
"leader": "ctrl+x", // 前导键设置(见下方说明)
"session_new": "<leader>n", // 新建会话:先按前导键,再按 n
"model_list": "<leader>m", // 打开模型列表:先按前导键,再按 m
"session_compact": "none" // 将值设为 "none" 可禁用该快捷键
}
}
一个操作可以绑定多个快捷键,用英文逗号分隔,任意一个触发即可执行该操作:
实例
"$schema": "https://opencode.ai/tui.json",
"keybinds": {
// 以下写法表示:按 pageup 或按 ctrl+alt+b,都可以向上翻页
"messages_page_up": "pageup,ctrl+alt+b"
}
}
前导键(Leader Key)
OpenCode 的大多数快捷键采用前导键(Leader Key)机制:先按下前导键,再按功能键,两键组合触发对应操作。这样设计的好处是避免与终端本身的快捷键产生冲突。
默认前导键为 ctrl+x。例如,新建会话的快捷键是 <leader>n,实际操作为:先按 ctrl+x,再按 n。
你可以将前导键改为任意组合键:
实例
"$schema": "https://opencode.ai/tui.json",
"keybinds": {
"leader": "ctrl+x" // 修改前导键为其他按键,如 "ctrl+space"、"alt+x" 等
// 配置中的 <leader> 占位符会自动替换为这里设置的按键
}
}
不一定必须使用前导键机制来设置快捷键——也可以直接绑定普通按键或组合键。但建议优先使用前导键,以避免与终端快捷键冲突。
禁用快捷键
将任意快捷键的值设为 "none" 即可禁用该操作,禁用后按任何键都不会触发它:
实例
"$schema": "https://opencode.ai/tui.json",
"keybinds": {
"session_compact": "none", // 禁用"压缩会话"快捷键
"scrollbar_toggle": "none", // 禁用"切换滚动条"快捷键
"tips_toggle": "none" // 禁用"切换提示"快捷键
}
}
完整快捷键列表
1、应用与界面
| 操作名称 | 默认快捷键 | 说明 |
|---|---|---|
app_exit |
ctrl+c, ctrl+d, <leader>q |
退出 OpenCode |
editor_open |
<leader>e |
用外部编辑器打开当前输入内容 |
theme_list |
<leader>t |
打开主题列表,切换界面主题 |
sidebar_toggle |
<leader>b |
显示或隐藏侧边栏 |
scrollbar_toggle |
无(默认禁用) | 显示或隐藏滚动条 |
username_toggle |
无(默认禁用) | 显示或隐藏用户名 |
status_view |
<leader>s |
查看当前状态信息 |
tool_details |
无(默认禁用) | 查看工具调用详情 |
command_list |
ctrl+p |
打开命令面板,搜索所有可用命令 |
tips_toggle |
<leader>h |
显示或隐藏使用提示 |
display_thinking |
无(默认禁用) | 显示或隐藏模型的思考过程 |
terminal_suspend |
ctrl+z |
挂起终端(将 OpenCode 放到后台,回到 shell;输入 fg 可恢复) |
terminal_title_toggle |
无(默认禁用) | 显示或隐藏终端标题栏 |
2、会话管理
| 操作名称 | 默认快捷键 | 说明 |
|---|---|---|
session_new |
<leader>n |
新建一个会话 |
session_list |
<leader>l |
查看所有历史会话列表 |
session_export |
<leader>x |
导出当前会话内容 |
session_timeline |
<leader>g |
查看当前会话的时间线 |
session_fork |
无(默认禁用) | 从当前位置创建一个分支会话 |
session_rename |
无(默认禁用) | 重命名当前会话 |
session_share |
无(默认禁用) | 分享当前会话 |
session_unshare |
无(默认禁用) | 取消分享当前会话 |
session_interrupt |
escape |
中断当前正在运行的响应 |
session_compact |
<leader>c |
压缩当前会话上下文,减少 Token 占用 |
session_child_first |
<leader>↓ |
跳转到第一个子会话 |
session_child_cycle |
<leader>→ |
在子会话间向前循环切换 |
session_child_cycle_reverse |
<leader>← |
在子会话间向后循环切换 |
session_parent |
<leader>↑ |
返回父会话 |
3、消息浏览
| 操作名称 | 默认快捷键 | 说明 |
|---|---|---|
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_half_page_up |
ctrl+alt+u |
向上滚动半页 |
messages_half_page_down |
ctrl+alt+d |
向下滚动半页 |
messages_first |
ctrl+g, home |
跳转到最早的第一条消息 |
messages_last |
ctrl+alt+g, end |
跳转到最新的最后一条消息 |
messages_next |
无(默认禁用) | 跳转到下一条消息 |
messages_previous |
无(默认禁用) | 跳转到上一条消息 |
messages_last_user |
无(默认禁用) | 跳转到最后一条用户消息 |
messages_copy |
<leader>y |
复制当前消息内容到剪贴板 |
messages_undo |
<leader>u |
撤销上一步操作 |
messages_redo |
<leader>r |
重做撤销的操作 |
messages_toggle_conceal |
<leader>h |
折叠或展开消息中的隐藏内容 |
4、模型与代理
| 操作名称 | 默认快捷键 | 说明 |
|---|---|---|
model_list |
<leader>m |
打开模型列表,选择切换当前使用的模型 |
model_cycle_recent |
f2 |
在最近使用过的模型中向前循环切换 |
model_cycle_recent_reverse |
shift+f2 |
在最近使用过的模型中向后循环切换 |
model_cycle_favorite |
无(默认禁用) | 在收藏的模型中向前循环切换 |
model_cycle_favorite_reverse |
无(默认禁用) | 在收藏的模型中向后循环切换 |
variant_cycle |
ctrl+t |
在当前模型的变体(如 thinking 模式)之间循环切换 |
agent_list |
<leader>a |
打开代理列表,选择切换当前使用的代理 |
agent_cycle |
tab |
向前循环切换代理 |
agent_cycle_reverse |
shift+tab |
向后循环切换代理 |
5、输入框编辑
| 操作名称 | 默认快捷键 | 说明 |
|---|---|---|
input_submit |
return |
发送当前输入内容 |
input_newline |
shift+return, ctrl+return, alt+return, ctrl+j |
在输入框中插入换行(不发送) |
input_clear |
ctrl+c |
清空输入框内容 |
input_paste |
ctrl+v |
粘贴剪贴板内容到输入框 |
input_move_left |
left, ctrl+b |
光标向左移动一个字符 |
input_move_right |
right, ctrl+f |
光标向右移动一个字符 |
input_move_up |
up |
光标向上移动一行 |
input_move_down |
down |
光标向下移动一行 |
input_word_forward |
alt+f, alt+right, ctrl+right |
光标向前跳过一个单词 |
input_word_backward |
alt+b, alt+left, ctrl+left |
光标向后跳过一个单词 |
input_line_home |
ctrl+a |
移动到当前行的开头 |
input_line_end |
ctrl+e |
移动到当前行的末尾 |
input_visual_line_home |
alt+a |
移动到当前视觉行(换行显示的行)的开头 |
input_visual_line_end |
alt+e |
移动到当前视觉行的末尾 |
input_buffer_home |
home |
跳转到整个输入框内容的最开头 |
input_buffer_end |
end |
跳转到整个输入框内容的最末尾 |
input_delete_to_line_end |
ctrl+k |
删除从光标到当前行末尾的所有内容 |
input_delete_to_line_start |
ctrl+u |
删除从当前行开头到光标的所有内容 |
input_delete_line |
ctrl+shift+d |
删除光标所在的整行 |
input_backspace |
backspace, shift+backspace |
删除光标前一个字符 |
input_delete |
ctrl+d, delete, shift+delete |
删除光标后一个字符 |
input_delete_word_forward |
alt+d, alt+delete, ctrl+delete |
删除光标后一个单词 |
input_delete_word_backward |
ctrl+w, ctrl+backspace, alt+backspace |
删除光标前一个单词 |
input_undo |
ctrl+-, super+z |
撤销输入框中的上一步编辑 |
input_redo |
ctrl+., super+shift+z |
重做撤销的编辑 |
6、文本选择
| 操作名称 | 默认快捷键 | 说明 |
|---|---|---|
input_select_left |
shift+left |
向左选中一个字符 |
input_select_right |
shift+right |
向右选中一个字符 |
input_select_up |
shift+up |
向上选中一行 |
input_select_down |
shift+down |
向下选中一行 |
input_select_word_forward |
alt+shift+f, alt+shift+right |
向前选中一个单词 |
input_select_word_backward |
alt+shift+b, alt+shift+left |
向后选中一个单词 |
input_select_line_home |
ctrl+shift+a |
从光标位置选中到当前行开头 |
input_select_line_end |
ctrl+shift+e |
从光标位置选中到当前行末尾 |
input_select_visual_line_home |
alt+shift+a |
从光标位置选中到当前视觉行开头 |
input_select_visual_line_end |
alt+shift+e |
从光标位置选中到当前视觉行末尾 |
input_select_buffer_home |
shift+home |
从光标位置选中到输入框最开头 |
input_select_buffer_end |
shift+end |
从光标位置选中到输入框最末尾 |
7、输入历史
| 操作名称 | 默认快捷键 | 说明 |
|---|---|---|
history_previous |
up |
调出上一条历史输入(输入框为空时有效) |
history_next |
down |
调出下一条历史输入 |
桌面版内置输入快捷键
OpenCode 桌面版的提示词输入框额外内置了一套 Readline / Emacs 风格的文本编辑快捷键,这些快捷键为内置功能,无法通过 tui.json 修改或禁用:
| 快捷键 | 操作 |
|---|---|
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 |
取消当前弹出窗口,或中止正在运行的响应 |
配置 Shift+Enter 换行
部分终端默认不会将带修饰键的 Enter(如 Shift+Enter)作为独立按键发送,导致在 OpenCode 中按 Shift+Enter 无法换行而是直接发送消息。需要在终端中手动配置该按键的转义序列。
Windows Terminal 配置方法
第一步:打开 Windows Terminal 的 settings.json 文件,路径为:
%LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json
第二步:在文件的根级 actions 数组中添加以下配置,定义一个发送 Shift+Enter 转义序列的动作:
实例
{
"command": {
"action": "sendInput",
"input": "\u001b[13;2u" // Shift+Enter 对应的标准转义序列(CSI u 格式)
},
"id": "User.sendInput.ShiftEnterCustom"
}
]
第三步:在文件的根级 keybindings 数组中添加按键绑定,将 Shift+Enter 映射到上面定义的动作:
实例
{
"keys": "shift+enter",
"id": "User.sendInput.ShiftEnterCustom"
}
]
第四步:保存 settings.json 文件后,重启 Windows Terminal 或打开一个新标签页使配置生效。
如果你使用的是其他终端(如 iTerm2、Kitty、Alacritty 等),请参考对应终端的文档,找到"按键映射"或"Key bindings"相关设置,将
Shift+Enter配置为发送\u001b[13;2u转义序列即可。
点我分享笔记