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 转义序列的动作:
实例
"actions": [
{
"command": {
"action": "sendInput",
"input": "\u001b[13;2u" // Shift+Enter 对应的标准转义序列(CSI u 格式)
},
"id": "User.sendInput.ShiftEnterCustom"
}
]**第三步:**在文件的根级 keybindings 数组中添加按键绑定,将 Shift+Enter 映射到上面定义的动作:
实例
"keybindings": [
{
"keys": "shift+enter",
"id": "User.sendInput.ShiftEnterCustom"
}
]**第四步:**保存 settings.json 文件后,重启 Windows Terminal 或打开一个新标签页使配置生效。
如果你使用的是其他终端(如 iTerm2、Kitty、Alacritty 等),请参考对应终端的文档,找到"按键映射"或"Key bindings"相关设置,将
Shift+Enter配置为发送\u001b[13;2u转义序列即可。
AI 思考中...