1. 前言

OpenCode 是一個開源於 GitHub 的 AI 代理,幫助你在終端機、IDE 或桌面端編寫程式碼。它甚至也有網頁模式(只要用 opencode web 啟動即可)。

OpenCode 的 TUI(Text User Interface,文字使用介面)是它最強大的使用方式之一。但很多人打開之後只會打字 + Enter,不知道裡面藏了一套完整的快捷鍵系統。這篇文章會從畫面佈局開始,然後把所有輸入區的按鍵按照「操作思維」分類,讓你用最短的時間上手。

本文依據

本文快捷鍵資訊基於 OpenCode 官方快捷鍵文件(最後更新:2026年4月24日),並結合個人 tui.json 自訂設定。

2. TUI 畫面佈局

OpenCode TUI 的主畫面分成下列幾個主要區域:

gh|700

  • 訊息區:累積了你輸入的提示文字、AI 的思考回應、工具輸出等對話內容

  • 輸入區:多行輸入框,支援完整的 Readline/Emacs 風格快捷鍵

  • 狀態列:顯示目前 Session 名稱、模型、Agent 模式等資訊

  • Sidebar(可選):右側面板,顯示檔案總管、工具清單等

3. 自訂按鍵

TUI 的設定檔是 tui.json,位於 OpenCode 設定目錄中:

  • Windows: %USERPROFILE%/.config/opencode/tui.json

  • macOS/Linux: ~/.config/opencode/tui.json

你可以透過修改 keybinds 區塊來自訂所有快捷鍵。將某個動作設為 "none" 即可停用該快捷鍵。

3.1. 我的 tui.json 設定

自訂設定

以下按鍵已被我修改過,預設按鍵可查看 官方快捷鍵文件


{

  "$schema": "https://opencode.ai/tui.json",

  "theme": "catppuccin",

  "keybinds": {

    "leader": "ctrl+x",

    "app_exit": "ctrl+c,<leader>q",

    "editor_open": "<leader>e",

    "theme_list": "<leader>t",

    "sidebar_toggle": "<leader>b",

    "scrollbar_toggle": "none",

    "username_toggle": "none",

    "status_view": "<leader>s",

    "tool_details": "none",

    "session_export": "<leader>x",

    "session_new": "<leader>n",

    "session_list": "<leader>l",

    "session_timeline": "<leader>g",

    "session_fork": "none",

    "session_rename": "none",

    "session_share": "none",

    "session_unshare": "none",

    "session_interrupt": "escape",

    "session_compact": "<leader>c",

    "session_child_first": "<leader>down",

    "session_child_cycle": "<leader>right",

    "session_child_cycle_reverse": "<leader>left",

    "session_parent": "<leader>up",

    "messages_page_up": "pageup,ctrl+alt+b",

    "messages_page_down": "pagedown,ctrl+alt+f",

    "messages_line_up": "up",

    "messages_line_down": "down",

    "messages_half_page_up": "alt+pageup",

    "messages_half_page_down": "alt+pgdown",

    "messages_first": "ctrl+home",

    "messages_last": "ctrl+end",

    "messages_next": "alt+down",

    "messages_previous": "alt+up",

    "messages_copy": "<leader>y",

    "messages_undo": "<leader>u",

    "messages_redo": "<leader>r",

    "messages_last_user": "none",

    "messages_toggle_conceal": "<leader>h",

    "model_list": "<leader>m",

    "model_cycle_recent": "f2",

    "model_cycle_recent_reverse": "shift+f2",

    "model_cycle_favorite": "none",

    "model_cycle_favorite_reverse": "none",

    "variant_cycle": "ctrl+t",

    "variant_list": "none",

    "command_list": "ctrl+p",

    "agent_list": "<leader>a",

    "agent_cycle": "tab",

    "agent_cycle_reverse": "shift+tab",

    "input_clear": "ctrl+c",

    "input_paste": "ctrl+v",

    "input_submit": "return",

    "input_newline": "ctrl+return,shift+return,ctrl+j",

    "input_move_left": "left,ctrl+b",

    "input_move_right": "right,ctrl+f",

    "input_move_up": "ctrl+1",

    "input_move_down": "ctrl+2",

    "input_select_left": "shift+left",

    "input_select_right": "shift+right",

    "input_select_up": "shift+up",

    "input_select_down": "shift+down",

    "input_line_home": "ctrl+a",

    "input_line_end": "ctrl+e",

    "input_select_line_home": "ctrl+shift+a",

    "input_select_line_end": "ctrl+shift+e",

    "input_visual_line_home": "alt+a",

    "input_visual_line_end": "alt+e",

    "input_select_visual_line_home": "alt+shift+a",

    "input_select_visual_line_end": "alt+shift+e",

    "input_buffer_home": "home",

    "input_buffer_end": "end",

    "input_select_buffer_home": "shift+home",

    "input_select_buffer_end": "shift+end",

    "input_delete_line": "ctrl+y",

    "input_delete_to_line_end": "ctrl+k",

    "input_delete_to_line_start": "ctrl+u",

    "input_backspace": "backspace,shift+backspace",

    "input_delete": "delete,shift+delete",

    "input_undo": "ctrl+z",

    "input_redo": "ctrl+.,super+shift+z",

    "input_word_forward": "alt+f,alt+right,ctrl+right",

    "input_word_backward": "alt+b,alt+left,ctrl+left",

    "input_select_word_forward": "alt+shift+f,alt+shift+right",

    "input_select_word_backward": "alt+shift+b,alt+shift+left",

    "input_delete_word_forward": "alt+d,alt+delete,ctrl+delete",

    "input_delete_word_backward": "ctrl+w,ctrl+backspace,alt+backspace",

    "history_previous": "ctrl+up",

    "history_next": "ctrl+down",

    "terminal_suspend": "",

    "terminal_title_toggle": "none",

    "tips_toggle": "<leader>h",

    "display_thinking": "none"

  },

  "scroll_speed": 3,

  "scroll_acceleration": {

    "enabled": true

  },

  "diff_style": "auto",

  "mouse": true,

  "plugin": [],

  "plugin_enabled": {}

}

3.2. Leader Key(前導鍵)

什麼是前導鍵?

OpenCode 的大多數快捷鍵使用 Leader(前導鍵),預設為 Ctrl+X。這可以避免與終端機中的其他快捷鍵衝突。操作方式是:先按前導鍵,再按對應的快捷鍵。例如新建 Session:先按 Ctrl+X,放開後再按 N

| 組合鍵 | 功能 | 對應斜線命令 |

| ------------ | ------------- | --------------------------------- |

| <leader> B | 切換 Sidebar 顯示 | |

| <leader> E | 開啟編輯器 | /editor |

| <leader> M | 模型列表 | /models |

| <leader> S | 狀態檢視 | /status |

| <leader> T | 主題切換 | /themes |

| <leader> N | 新增 Session | /new/clear |

| <leader> L | Session 列表 | /sessions |

| <leader> G | Session 時間線 | /timeline |

| <leader> X | 匯出 Session | /export |

| <leader> C | 壓縮對話上下文 | /compact |

| <leader> A | Agent 列表 | /agents |

| <leader> H | 顯示/隱藏提示 | |

| <leader> Q | 離開應用程式 | /exit/quit:qquit |

| <leader> U | 訊息區 Undo | /undo |

| <leader> R | 訊息區 Redo | |

| <leader> Y | 複製訊息 | /copy |

3.3. 模式切換

  • Tab / Shift + Tab:在 Build 模式(執行程式)和 Plan 模式(規劃架構)之間切換

  • F2 / Shift + F2:循環切換最近使用的模型

  • Ctrl + P:開啟命令面板

  • Ctrl + T:循環切換模型變體(variant),low、medium、high等切換

4. 輸入區按鍵完整分類

以下將輸入區所有快捷鍵,依操作思維分為七大類。記住分類遠比死背個別按鍵有效。

4.1. 第 1 類:提交與清除

| 按鍵 | 功能 | 說明 |

| --------------- | ------- | --------------------------------- |

| Enter | 送出訊息 | |

| Shift + Enter | 換行(不送出) | ⚠️ Windows Terminal 可能需要額外設定(見下方) |

| Ctrl + Enter | 換行(不送出) | |

| Alt + Enter | 換行(不送出) | Windows 終端機可能無效 |

| Ctrl + J | 換行(不送出) | 推薦使用,最穩定 |

| Ctrl + C | 清除整行 | 也可中止 AI 回應,建議修改 |

新手最常犯的錯

在輸入多行 prompt 時,不小心按到 Enter 而非 Shift + Enter,導致訊息還沒寫完就送出去了。養成習慣:換行用 Shift + EnterCtrl + J

Windows Terminal 的 Shift+Enter 設定

某些終端機預設不會發送帶修飾鍵的 Enter 鍵。如果你發現 Shift + Enter 沒反應,需要在 Windows Terminal 的 settings.json 中設定:

actions 陣列中加入:

{

"command": { "action": "sendInput", "input": "\u001b[13;2u" },

"id": "User.sendInput.ShiftEnterCustom"

}

keybindings 陣列中加入:

{ "keys": "shift+enter", "id": "User.sendInput.ShiftEnterCustom" }

儲存後重新啟動 Windows Terminal 即可。

4.2. 第 2 類:游標移動

OpenCode 輸入區完整支援 Bash/Readline 風格的快捷鍵,熟悉終端機的人可以無縫上手。

| 按鍵 | 動作 | 記憶口訣 |

| ---------------- | -------- | --------------- |

| / Ctrl + B | 向左一字元 | Backward |

| / Ctrl + F | 向右一字元 | Forward |

| | 向上一行 | |

| | 向下一行 | |

| Ctrl + A | 移到行首 | A = 頭 |

| Ctrl + E | 移到行尾 | E = End |

| Home | 移到緩衝區最前面 | |

| End | 移到緩衝區最後面 | |

| Alt + A | 移到視覺行首 | visual line |

| Alt + E | 移到視覺行尾 | visual line |

核心記憶法Ctrl + A/E 是行首/行尾(最常用),Home/End 是整個輸入區的最前/最後。輸入區有多行內容時,這幾個按鍵才能看出差異。

4.3. 第 3 類:文字選取

規則只有一條:任何移動鍵 + Shift = 選取

| 移動鍵 | + Shift 變成選取 |

| ------ | ---------------- |

| / | Shift + ← / Shift + → 選取字元 |

| / | Shift + ↑ / Shift + ↓ 選取行 |

| Ctrl + A | Ctrl + Shift + A 選取到行首 |

| Ctrl + E | Ctrl + Shift + E 選取到行尾 |

| Home / End | Shift + Home / Shift + End 選取到緩衝區首尾 |

| Alt + A / Alt + E | Alt + Shift + A / Alt + Shift + E 選取到視覺行首尾 |

| Alt + ← / Alt + → | Alt + Shift + ← / Alt + Shift + → 選取一個單字 |

4.4. 第 4 類:刪除操作

刪除操作是 OpenCode 輸入區最強大的部分,支援多種粒度的刪除。

| 按鍵 | 功能 | 等級 |

| --------------------------------------------------- | --------- | --- |

| Backspace | 刪除游標前一字元 | 字元 |

| Ctrl + D / Delete | 刪除游標所在字元 | 字元 |

| Ctrl + W / Ctrl + Backspace / Alt + Backspace | 刪除前一個英文單字 | 單字 |

| Alt + D / Alt + Delete / Ctrl + Delete | 刪除後一個英文單字 | 單字 |

| Ctrl + K | 刪除游標到行尾 | 行 |

| Ctrl + U | 刪除游標到行首 | 行 |

| Ctrl+Shift+D | 刪除整行 | 行 |

4.5. 第 5 類:字詞跳躍

英文環境下特別好用,以「單字」為單位跳躍游標。

| 按鍵 | 功能 |

| ---------------------------------- | ------ |

| Alt + F / Alt + → / Ctrl + → | 向前一個單字 |

| Alt + B / Alt + ← / Ctrl + ← | 向後一個單字 |

選取版(加上 Shift):

| 按鍵 | 功能 |

| ---- | ---- |

| Alt + Shift + F / Alt + Shift + → | 選取到下一個單字 |

| Alt + Shift + B / Alt + Shift + ← | 選取到上一個單字 |

4.6. 第 6 類:歷史記錄

| 按鍵 | 功能 |

| --- | --------- |

| | 上一筆輸入過的內容 |

| | 下一筆輸入過的內容 |

OpenCode 會記住你在當前 session 中的所有輸入,用上下鍵就能快速找回之前打過的 prompt。

4.7. 第 7 類:復原、重做、貼上與其他編輯

| 按鍵 | 功能 |

| ------------------------------------- | ------------------- |

| Ctrl + - / Ctrl + Z / Super + Z | 復原(undo) |

| Ctrl + . / Super + Shift + Z | 重做(redo) |

| Ctrl + V | 貼上 |

| Ctrl + T | 交換游標前後字元(transpose) |

| Ctrl + G | 取消彈出視窗 / 中止正在執行的回應 |

桌面版提示詞輸入快捷鍵

OpenCode 桌面應用程式的提示詞輸入框支援常見的 Readline/Emacs 風格文字編輯快捷鍵。這些快捷鍵為內建功能,目前無法透過 opencode.json 進行設定。

5. 訊息檢視區快捷鍵

除了輸入區,訊息檢視區也有實用的快捷鍵:

| 按鍵 | 功能 |

| ----------------------------- | --------- |

| PageUp / Ctrl + Alt + B | 整頁上翻 |

| PageDown / Ctrl + Alt + F | 整頁下翻 |

| Ctrl + Alt + Y | 逐行向上 |

| Ctrl + Alt + E | 逐行向下 |

| Ctrl + Alt + U | 半頁向上 |

| Ctrl + Alt + D | 半頁向下 |

| Ctrl + G / Home | 跳到第一則訊息 |

| Ctrl + Alt + G / End | 跳到最後一則訊息 |

| <leader> Y | 複製訊息 |

| <leader> U | 訊息區 Undo |

| <leader> R | 訊息區 Redo |

| <leader> H | 切換隱藏/顯示內容 |

6. Session 導航

OpenCode 支援巢狀 Session(子對話),可以來回切換:

| 按鍵 | 功能 |

| ---- | ---- |

| <leader> Down | 進入第一個子 Session |

| <leader> Right | 循環到下一個子 Session |

| <leader> Left | 循環到上一個子 Session |

| <leader> Up | 回到父 Session |

| Escape | 中斷目前 Session |

| <leader> N | 新增 Session |

| <leader> L | Session 列表 |

| <leader> G | Session 時間線 |

| <leader> X | 匯出 Session |

| <leader> C | 壓縮對話上下文 |

7. 結語

OpenCode TUI 的快捷鍵設計源自 Bash/Readline,加上自己的 Leader Key 系統。與其死背整張表,不如理解分類邏輯——移動、選取、刪除、送出——把常用鍵融入日常操作,剩下的隨用隨查就好。

8. 附錄:完整快捷鍵速查表

| 類別 | 按鍵 | 功能 |

| ----------- | ---------------------------- | ----------- |

| 提交 | Enter | 送出訊息 |

| | Shift + Enter / Ctrl + J | 換行 |

| | Ctrl + C | 清除輸入 / 中止回應 |

| 移動 | Ctrl + A | 行首 |

| | Ctrl + E | 行尾 |

| | Alt + B / Alt + F | 前/後一個單字 |

| | Home / End | 緩衝區首/尾 |

| 選取 | Shift + ←/→/↑/↓ | 選取字元/行 |

| | Ctrl + Shift + A/E | 選取到行首/尾 |

| | Alt + Shift + ←/→ | 選取單字 |

| 刪除 | Ctrl + K | 刪到行尾 |

| | Ctrl + U | 刪到行首 |

| | Ctrl + Shift + D | 刪除整行 |

| | Ctrl + W | 刪前一個單字 |

| | Alt + D | 刪後一個單字 |

| 歷史 | / | 上/下一筆輸入 |

| 復原 | Ctrl + - / Ctrl + Z | 復原 |

| | Ctrl + . | 重做 |

| 貼上 | Ctrl + V | 貼上 |

| 其他 | Ctrl + T | 交換字元 |

| | Ctrl + G | 中止回應 |

| 模型 | <leader> M | 模型列表 |

| | F2 | 切換模型 |

| | Ctrl + T | 切換 variant |

| Session | <leader> N | 新增 |

| | <leader> C | 壓縮上下文 |

| | Escape | 中斷 |

| 介面 | <leader> B | 側邊欄 |

| | Ctrl + P | 命令面板 |

| | Tab | 切換 Agent |

💡 相關鏈接

解說文章(繁體中文)

Explanation article(English)

解説記事(日本語)

9. 教學影片

https://youtu.be/8mgj7IxtkDg

##