OpenCode 作为一款开源的 AI 编程助手,其终端界面(TUI)是用户日常交互的核心。一个舒适、美观的配色方案不仅能提升视觉体验,还能减少长时间编码时的视觉疲劳。OpenCode 提供了灵活的主题系统,支持内置主题切换、跟随系统主题、以及完全自定义配色。本文将从基础使用到高级定制,带你全面掌握 OpenCode 的主题配置。
在使用 OpenCode 主题之前,需要确保终端支持 truecolor(24 位真彩色)。大多数现代终端模拟器默认支持,但可以通过以下方式验证:
echo $COLORTERM
如果输出为 truecolor 或 24bit,则说明支持。若未启用,可以在 shell 配置文件中设置环境变量:
export COLORTERM=truecolor
支持 truecolor 的主流终端包括 iTerm2、Alacritty、Kitty、Windows Terminal 以及最新版本的 GNOME Terminal 等。如果终端不支持真彩色,主题会降级到 256 色近似显示,效果会有所折扣。
OpenCode 内置了十几款精心设计的主题,覆盖了当前开发者社区中最流行的配色方案:
| 主题名称 | 描述 |
|---------|------|
| system | 自适应终端背景色 |
| tokyonight | 基于 Tokyo Night |
| everforest | 基于 Everforest |
| ayu | 基于 Ayu 暗色主题 |
| catppuccin | 基于 Catppuccin |
| catppuccin-macchiato | Catppuccin Macchiato 变体 |
| gruvbox | 基于 Gruvbox |
| kanagawa | 基于 Kanagawa |
| nord | 基于 Nord |
| matrix | 黑客风格的绿底黑字 |
| one-dark | 基于 Atom One Dark |
默认情况下,OpenCode 使用自家的 opencode 主题。
在 OpenCode TUI 中,可以直接输入 /theme 命令打开主题选择器,通过交互式界面实时预览并切换主题:
/theme
选择器会列出所有可用主题,选中后立即生效。
主题配置位于项目根目录的 .opencode/tui.json 文件中:
{
"$schema": "https://opencode.ai/tui.json",
"theme": "tokyonight"
}
修改后重启 OpenCode 即可生效。
system 主题是 OpenCode 的一个特色设计,它不使用固定颜色,而是动态适配终端的当前配色方案:
none,保持终端原生外观适合以下场景:
OpenCode 的主题系统基于 JSON 格式,支持从简单的颜色覆盖到完整的主题定义。
主题从多个位置加载,优先级从低到高:
内置主题 — 嵌入在二进制文件中
用户配置目录 — ~/.config/opencode/themes/*.json
项目根目录 — .opencode/themes/*.json
当前工作目录 — ./.opencode/themes/*.json
后加载的目录会覆盖先加载的同名主题。这意味你可以先在用户目录定义通用主题,再在项目中微调覆盖。
创建用户级全局主题:
mkdir -p ~/.config/opencode/themes touch ~/.config/opencode/themes/my-theme.json
创建项目级主题:
mkdir -p .opencode/themes touch .opencode/themes/my-theme.json
主题文件包含两个主要部分:defs(可选的颜色定义)和 theme(实际的配色方案)。
颜色值支持以下格式:
"#ffffff"3(0-255)"primary" 或自定义定义名{"dark": "#000", "light": "#fff"}"none" — 使用终端默认色或透明以下是完整的主题配置项,涵盖了 UI 各个部分的颜色控制:
{
"$schema": "https://opencode.ai/theme.json",
"defs": {},
"theme": {
"primary": {},
"secondary": {},
"accent": {},
"error": {},
"warning": {},
"success": {},
"info": {},
"text": {},
"textMuted": {},
"background": {},
"backgroundPanel": {},
"backgroundElement": {},
"border": {},
"borderActive": {},
"borderSubtle": {},
"diffAdded": {},
"diffRemoved": {},
"diffContext": {},
"diffHunkHeader": {},
"diffHighlightAdded": {},
"diffHighlightRemoved": {},
"diffAddedBg": {},
"diffRemovedBg": {},
"diffContextBg": {},
"diffLineNumber": {},
"diffAddedLineNumberBg": {},
"diffRemovedLineNumberBg": {},
"markdownText": {},
"markdownHeading": {},
"markdownLink": {},
"markdownLinkText": {},
"markdownCode": {},
"markdownBlockQuote": {},
"markdownEmph": {},
"markdownStrong": {},
"markdownHorizontalRule": {},
"markdownListItem": {},
"markdownListEnumeration": {},
"markdownImage": {},
"markdownImageText": {},
"markdownCodeBlock": {},
"syntaxComment": {},
"syntaxKeyword": {},
"syntaxFunction": {},
"syntaxVariable": {},
"syntaxString": {},
"syntaxNumber": {},
"syntaxType": {},
"syntaxOperator": {},
"syntaxPunctuation": {}
}
}
下面以经典的 Nord 配色方案为例,创建一个完整的自定义主题:
{
"$schema": "https://opencode.ai/theme.json",
"defs": {
"nord0": "#2E3440",
"nord1": "#3B4252",
"nord2": "#434C5E",
"nord3": "#4C566A",
"nord4": "#D8DEE9",
"nord5": "#E5E9F0",
"nord6": "#ECEFF4",
"nord7": "#8FBCBB",
"nord8": "#88C0D0",
"nord9": "#81A1C1",
"nord10": "#5E81AC",
"nord11": "#BF616A",
"nord12": "#D08770",
"nord13": "#EBCB8B",
"nord14": "#A3BE8C",
"nord15": "#B48EAD"
},
"theme": {
"primary": { "dark": "nord8", "light": "nord10" },
"secondary": { "dark": "nord9", "light": "nord9" },
"accent": { "dark": "nord7", "light": "nord7" },
"error": { "dark": "nord11", "light": "nord11" },
"warning": { "dark": "nord12", "light": "nord12" },
"success": { "dark": "nord14", "light": "nord14" },
"info": { "dark": "nord8", "light": "nord10" },
"text": { "dark": "nord4", "light": "nord0" },
"textMuted": { "dark": "nord3", "light": "nord1" },
"background": { "dark": "nord0", "light": "nord6" },
"backgroundPanel": { "dark": "nord1", "light": "nord5" },
"backgroundElement": { "dark": "nord1", "light": "nord4" },
"border": { "dark": "nord2", "light": "nord3" },
"borderActive": { "dark": "nord3", "light": "nord2" },
"borderSubtle": { "dark": "nord2", "light": "nord3" },
"diffAdded": { "dark": "nord14", "light": "nord14" },
"diffRemoved": { "dark": "nord11", "light": "nord11" },
"diffContext": { "dark": "nord3", "light": "nord3" },
"markdownHeading": { "dark": "nord8", "light": "nord10" },
"markdownCode": { "dark": "nord14", "light": "nord14" },
"markdownLink": { "dark": "nord9", "light": "nord9" },
"syntaxKeyword": { "dark": "nord9", "light": "nord9" },
"syntaxFunction": { "dark": "nord8", "light": "nord8" },
"syntaxString": { "dark": "nord14", "light": "nord14" },
"syntaxNumber": { "dark": "nord15", "light": "nord15" },
"syntaxType": { "dark": "nord7", "light": "nord7" }
}
}
将此文件保存为 ~/.config/opencode/themes/nord.json,然后在 tui.json 中设置 "theme": "nord" 即可应用。
注意到上面的配色中每个颜色都用了 dark 和 light 两个变体。OpenCode 会根据用户的终端背景色自动选择对应的变体。这是实现亮色/暗色主题自动切换的关键:
dark 变体light 变体这意味着一个主题文件同时覆盖亮色和暗色场景,无需为不同模式准备两套主题。
创建自定义主题时,建议采用增量方式:
先基于一个内置主题(如 tokyonight)复制其配色
逐步替换个别颜色项,观察效果
使用 /theme 命令快速切换确认修改生效
利用 "none" 值让特定元素继承终端原生颜色
OpenCode 的主题系统设计灵活而强大,从开箱即用的内置主题到完全自定义的 JSON 配置,满足了不同层次的需求。掌握主题配置不仅能让你打造个性化的编程环境,还能通过明暗自适应功能在不同光线条件下获得舒适的视觉体验。建议从内置主题开始尝试,逐步过渡到自定义配色,打造属于你自己的 OpenCode 风格。