設定快捷鍵
用 tui.json 調整少數真正影響效率的 OpenCode TUI 快捷鍵。
📖 本篇術語速查表
| 英文 / 縮寫 | 中文 | 一句話解釋 |
|---|---|---|
| Keybinds | 快捷鍵 | 自定義操作按鍵。 |
| 衝突 | conflict | 避免和終端 / 系統撞鍵。 |
| 習慣遷移 | migrate | 沿用熟悉的鍵位。 |
不想讀完?把下面這段提示詞丟給 AI 幫你跑完——幫你把 OpenCode 快捷鍵調成順手又不衝突的設定。
你是 OpenCode 快捷鍵顧問。
【角色】
OpenCode 快捷鍵顧問,按最小夠用、安全優先的原則給可落地方案,每條結論都落到能照做的步驟或示例,不停留在空泛建議。
【輸入】
- 我最常用的操作:___
- 習慣的鍵位風格:___
- 和終端 / 系統是否衝突:___
- 用的終端:___
- 經驗水平:___
【工作流程】
1. 梳理可定製的按鍵
2. 按高頻操作排鍵位
3. 排查衝突
4. 遷移熟悉鍵位
5. 給驗證
【輸出規範】
▌一、可定製按鍵
▌二、鍵位安排
▌三、衝突排查
▌四、遷移 + 驗證
【硬約束】
- 先排高頻操作
- 避開終端 / 系統佔用鍵
- 改後實測無衝突
- 不要替我臆測情況或編造不存在的功能,資訊不全先問清
- 不確定的設定或介面一律以官方文件為準,禁止照搬過時寫法
- 給的每條結論都要落到具體可照做的步驟或示例,不停留在「建議」「考慮一下」這類沒法直接執行的空泛表述OpenCode 的快捷鍵透過 tui.json 的 keymap 欄位自定義(新手不需要複製完整快捷鍵表,只改每天會用、且和終端衝突的少數幾個鍵)。
從 keybinds 遷移到 keymap:舊的 keybinds 欄位(用 _ 分隔的扁平命令名,如 session_new)官方已棄用,將在 OpenCode v2.0 移除;新的 keymap 用 . 分隔的命令名(如 session.new),並按 sections 分組。兩者同時存在時只 keymap 生效。本篇示例統一用 keymap。
這一篇用 6 分鐘換什麼:你會知道先改哪些高頻快捷鍵、leader key 怎麼理解、衝突鍵怎麼停用,以及 Shift+Enter 不能換行時該排查哪裡。
先給結論:只改高頻和衝突
快捷鍵不是為了把所有功能都背下來,而是減少高頻動作的打斷感。新手真正會遇到的問題通常有三個:找不到會話/模型/agent 列表,輸入多行提示詞不順手,終端、tmux、編輯器和 OpenCode 搶同一個快捷鍵。
flowchart LR
Need["高頻動作"] --> Leader["保留 leader key"]
Leader --> Bind["繫結會話 / 模型 / agent / 壓縮"]
Bind --> Conflict["衝突鍵設為 none"]
Conflict --> Verify["重啟 TUI 驗證"]
style Need fill:#dbeafe,stroke:#3b82f6
style Conflict fill:#fef3c7,stroke:#f59e0b
style Verify fill:#dcfce7,stroke:#22c55e,stroke-width:2px
設定思路應該是“只改高頻和衝突”,不是複製一份完整快捷鍵表。
最小設定
推薦從這幾個鍵開始(按 keymap.sections 分組):
{
"$schema": "https://opencode.ai/tui.json",
"keymap": {
"leader": "ctrl+x",
"leader_timeout": 2000,
"sections": {
"global": {
"session.new": "<leader>n",
"session.list": "<leader>l",
"model.list": "<leader>m",
"agent.list": "<leader>a"
},
"session": {
"session.compact": "<leader>c"
},
"input": {
"input.newline": ["shift+return", "ctrl+return", "alt+return", "ctrl+j"]
}
}
}
}這段設定覆蓋的是高頻入口:新會話、會話列表、模型選擇、agent 選擇、壓縮上下文和輸入換行。keymap 會和內建預設值合併,所以你只需要寫自己想改的鍵,不用複製完整列表。
leader key 怎麼理解
leader 是組合快捷鍵的字首。預設用 ctrl+x,例如 <leader>n 就是先按 ctrl+x,再按 n。
建議保留一個前導鍵,而不是把所有動作都繫結成單鍵。終端、Shell、編輯器、tmux 都會佔用快捷鍵,前導鍵可以降低衝突。
停用衝突鍵
如果某個快捷鍵和你的終端或編輯器衝突,把它設為 "none":
{
"$schema": "https://opencode.ai/tui.json",
"keymap": {
"sections": {
"session": {
"session.compact": "none"
}
}
}
}不要為了“完整”複製官方全量 keymap。完整設定會讓你以後看不出自己到底改了什麼。
輸入區常用鍵
桌面版提示詞輸入框支援常見 Readline / Emacs 風格快捷鍵,這部分通常不用設定:
ctrl+a:移動到目前行開頭。ctrl+e:移動到目前行末尾。ctrl+b/ctrl+f:向左 / 向右移動一個字元。alt+b/alt+f:向左 / 向右移動一個單詞。ctrl+k:刪除到行尾。ctrl+u:刪除到行首。ctrl+w:刪除前一個單詞。
這些鍵和 Shell 輸入習慣一致。先熟悉它們,通常比改一大份快捷鍵設定更有收益。
Shift+Enter 不能換行怎麼辦
如果 Shift+Enter 不能換行,問題通常不在 OpenCode,而在終端沒有傳送帶修飾鍵的 Enter 序列。
Windows Terminal 需要在 settings.json 裡給 shift+enter 繫結 sendInput,輸入值是 \u001b[13;2u。改完後重啟終端或新開一個標籤頁再測試。
macOS 常見終端通常不需要額外設定;如果遇到衝突,優先檢查終端自己的快捷鍵設定。
怎麼判斷設定有效
改完 tui.json 後,重啟 OpenCode 或重新開啟 TUI,再驗證:
<leader>n(即ctrl+x然後n)能建立新會話。<leader>m能開啟模型選擇。<leader>a能開啟 agent 選擇。<leader>c能壓縮上下文,或按你的設定被停用。Tab能在主代理之間切換(預設綁agent.cycle,是 03 篇 Plan/Build 切換的底層機制)。- 提示詞輸入區能按預期換行和提交。
如果某個快捷鍵沒反應,先檢查是否被終端、tmux 或編輯器截獲。OpenCode 收不到按鍵時,改 OpenCode 設定不會生效。
接下來去哪
TUI 工作流
把快捷鍵放回 TUI 的 `@`、`!`、`/`、會話和模型切換流程裡理解。
切換主題
快捷鍵之外,主題和 diff 樣式也會影響長期使用體驗。
設定 OpenCode
區分 `tui.json` 和 `opencode.json`,避免把體驗偏好和執行設定混在一起。
終端工作流
從真實日常任務角度理解什麼時候需要快捷鍵,什麼時候用命令更清楚。
官方資料
- OpenCode Keybinds:https://opencode.ai/docs/keybinds
- OpenCode TUI:https://opencode.ai/docs/tui