用过编辑器的人都知道快捷键顺不顺手基本决定了每天用着开不开心。OpenCode 自然也想到了这一点——它把快捷键的定制权限完全交给了使用者想怎么改就怎么改。从哪里动手tui.json所有和终端界面相关的配置都放在tui.json这个文件里。里面有一个专门的keybinds字段用来定义各种操作的快捷键。为了方便官方还提供了一个 JSON Schema 文件地址是https://opencode.ai/tui.json写配置的时候可以用它来获得提示和校验。下面是一个简化的例子只展示了快捷键部分长什么样{$schema:https://opencode.ai/tui.json,leader_timeout:2000,keybinds:{leader:ctrlx,app_exit:ctrlc,ctrld,leaderq,session_rename:ctrlr,input_paste:{key:ctrlv,preventDefault:false}}}主角是「前缀键」OpenCode 大量使用了一个叫Leader Key的设计。简单说就是先按一个特殊的“前缀键”再按其他键来触发命令。这么做的好处很明显——避免和终端本身的快捷键打架。默认情况下ctrlx就是那个前缀键。比如想新建一个会话需要先按ctrlx紧接着再按n因为session_new绑的是leadern。当然使用者完全不用这个前缀键直接把完整快捷键写死也可以但官方还是推荐保留这种设计。有个叫leader_timeout的参数默认是 2000 毫秒。它决定了按下前缀键之后系统会等多久再放弃等待下一个按键。另外一些导航类的快捷键故意没有用前缀键。比如在子代理会话里session_child_first默认是leaderdown这又用了前缀键而session_child_cycle直接就是rightsession_parent直接就是up。绑定的值可以怎么写一个快捷键的绑定值支持好几种写法单个快捷键的字符串ctrlc多个快捷键用逗号分隔的字符串ctrlc,ctrld数组形式[leadery, ctrlshiftc]更高级的对象当需要控制preventDefault或者fallthrough行为时可以写成{ key: ctrlv, preventDefault: false }举个例子想把复制消息同时绑成前缀键y和传统的ctrlshiftc可以这么写{keybinds:{messages_copy:[leadery,ctrlshiftc],input_paste:{key:ctrlv,preventDefault:false}}}不想用某个快捷键直接关了如果不希望某个操作有快捷键或者担心误触把它设成none或者false就行。比如觉得压缩会话的快捷键容易按错{keybinds:{session_compact:none}}这样session_compact就没有任何快捷键了。Windows 用户注意两点在 Windows 上有两处默认行为不太一样input_undoWindows 下默认是ctrlz,ctrl-,superz。因为 Windows 终端不支持 POSIX 的挂起机制所以加上了ctrlz这个绑定。terminal_suspend被强制设成了none。理由同上——原生 Windows 终端不支持挂起。桌面应用自带的输入框快捷键如果用的是 OpenCode 桌面版那么输入提示内容的时候默认支持一套常见的 Readline / Emacs 风格快捷键。这些是内置的目前不能在opencode.json里修改。常用的包括快捷键作用ctrla跳到当前行开头ctrle跳到当前行末尾ctrlb光标左移一个字符ctrlf光标右移一个字符altb光标左移一个单词altf光标右移一个单词ctrld删除光标处的字符ctrlk删除从光标到行尾的内容ctrlu删除从光标到行首的内容ctrlw删除前一个单词altd删除后一个单词ctrlt交换光标前后两个字符ctrlg取消弹出框 / 中断正在进行的响应让ShiftEnter工作起来有些终端默认不会把修饰键和 Enter 一起发送。如果需要使用ShiftEnter比如在输入框里换行而不是提交得手动配置一下终端。以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:shiftenter,id:User.sendInput.ShiftEnterCustom}保存文件然后重启 Windows Terminal 或者直接开一个新标签页。之后ShiftEnter就能正常被 OpenCode 识别了。把常用的快捷键调教成自己熟悉的那一套用起来才真的顺手。OpenCode 把这一切都敞开了改与不改、怎么改全都由使用者自己决定。