跳转到内容

主题

选择内置主题或自定义主题。

使用 OpenCode 时,你可以从多个内置主题中进行选择,使用自动适配终端配色的系统主题,或者定义自己的自定义主题。

默认情况下,OpenCode 使用自家的 opencode 主题。


终端要求

为了让主题的完整色板正确显示,你的终端需要支持 truecolor(24 位色)。大多数现代终端默认支持,但有时需要手动开启:

  • 检查支持情况:运行 echo $COLORTERM,应输出 truecolor24bit
  • 开启 truecolor:在 shell 配置中设置环境变量 COLORTERM=truecolor
  • 终端兼容性:确保终端模拟器支持 24 位色(如 iTerm2、Alacritty、Kitty、Windows Terminal、较新的 GNOME Terminal 等)

如果终端不支持 truecolor,主题可能会降级为 256 色近似,颜色精确度会降低。


内置主题

OpenCode 自带多种内置主题:

名称描述
system自动适配终端背景色
tokyonight基于 Tokyonight 主题
everforest基于 Everforest 主题
ayu基于 Ayu 暗色主题
catppuccin基于 Catppuccin 主题
catppuccin-macchiato基于 Catppuccin 主题
gruvbox基于 Gruvbox 主题
kanagawa基于 Kanagawa 主题
nord基于 Nord 主题
matrix黑底绿色的“黑客风”主题
one-dark基于 Atom One 暗色主题

我们还会持续增加更多主题。


系统主题

system 主题会自动适配你的终端配色。与使用固定颜色的传统主题不同,system 主题具有以下特点:

  • 生成灰度:基于终端背景色动态生成灰度,保证对比度合理
  • 使用 ANSI 颜色:利用标准 ANSI 颜色(0–15)做语法高亮和 UI 元素,尊重终端自带的色板
  • 保留终端默认值:文字和背景颜色使用 none,保持终端原生外观

系统主题适合:

  • 希望 OpenCode 完全融入现有终端外观的用户
  • 使用自定义终端配色方案的用户
  • 想在所有终端应用中保持统一风格的用户

使用主题

你可以通过 /theme 命令调出主题选择器来切换主题,也可以在 配置文件 中指定:

opencode.json
{
"$schema": "https://opencode.ai/config.json",
"theme": "tokyonight"
}

自定义主题

OpenCode 支持灵活的 JSON 主题系统,你可以很方便地创建和定制自己的主题。


加载层级

主题会从多个目录中加载,后加载的目录会覆盖前面的:

  1. 内置主题 —— 编译进二进制
  2. 用户配置目录 —— ~/.config/opencode/themes/*.json$XDG_CONFIG_HOME/opencode/themes/*.json
  3. 项目根目录 —— <project-root>/.opencode/themes/*.json
  4. 当前工作目录 —— ./.opencode/themes/*.json

如果多个目录中存在同名主题,会以优先级更高的目录版本为准。


创建主题

要创建自定义主题,只需在上述主题目录之一中新增 JSON 文件。

用户级主题示例:

Terminal window
mkdir -p ~/.config/opencode/themes
vim ~/.config/opencode/themes/my-theme.json

项目级主题示例:

Terminal window
mkdir -p .opencode/themes
vim .opencode/themes/my-theme.json

JSON 格式

主题使用灵活的 JSON 格式,支持:

  • Hex 颜色"#ffffff"
  • ANSI 颜色3(0–255)
  • 颜色引用"primary" 或自定义命名颜色
  • 暗/亮变体{"dark": "#000", "light": "#fff"}
  • 不设置颜色"none" —— 使用终端默认前景或背景色

颜色定义

可选的 defs 字段允许你定义可复用的颜色变量,然后在主题各处通过名称引用。


终端默认色

特殊值 "none" 可以用于任何颜色字段,表示继承终端默认颜色。这对需要与终端配色高度融合的主题很有用:

  • "text": "none" —— 使用终端默认前景色
  • "background": "none" —— 使用终端默认背景色

示例

下面是一个自定义主题示例(基于 Nord):

my-theme.json
{
"$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" },
"diffHunkHeader": { "dark": "nord3", "light": "nord3" },
"diffHighlightAdded": { "dark": "nord14", "light": "nord14" },
"diffHighlightRemoved": { "dark": "nord11", "light": "nord11" },
"diffAddedBg": { "dark": "#3B4252", "light": "#E5E9F0" },
"diffRemovedBg": { "dark": "#3B4252", "light": "#E5E9F0" },
"diffContextBg": { "dark": "nord1", "light": "nord5" },
"diffLineNumber": { "dark": "nord2", "light": "nord4" },
"diffAddedLineNumberBg": { "dark": "#3B4252", "light": "#E5E9F0" },
"diffRemovedLineNumberBg": { "dark": "#3B4252", "light": "#E5E9F0" },
"markdownText": { "dark": "nord4", "light": "nord0" },
"markdownHeading": { "dark": "nord8", "light": "nord10" },
"markdownLink": { "dark": "nord9", "light": "nord9" },
"markdownLinkText": { "dark": "nord7", "light": "nord7" },
"markdownCode": { "dark": "nord14", "light": "nord14" },
"markdownBlockQuote": { "dark": "nord3", "light": "nord3" },
"markdownEmph": { "dark": "nord12", "light": "nord12" },
"markdownStrong": { "dark": "nord13", "light": "nord13" },
"markdownHorizontalRule": { "dark": "nord3", "light": "nord3" },
"markdownListItem": { "dark": "nord8", "light": "nord10" },
"markdownListEnumeration": { "dark": "nord7", "light": "nord7" },
"markdownImage": { "dark": "nord9", "light": "nord9" },
"markdownImageText": { "dark": "nord7", "light": "nord7" },
"markdownCodeBlock": { "dark": "nord4", "light": "nord0" },
"syntaxComment": { "dark": "nord3", "light": "nord3" },
"syntaxKeyword": { "dark": "nord9", "light": "nord9" },
"syntaxFunction": { "dark": "nord8", "light": "nord8" },
"syntaxVariable": { "dark": "nord7", "light": "nord7" },
"syntaxString": { "dark": "nord14", "light": "nord14" },
"syntaxNumber": { "dark": "nord15", "light": "nord15" },
"syntaxType": { "dark": "nord7", "light": "nord7" },
"syntaxOperator": { "dark": "nord9", "light": "nord9" },
"syntaxPunctuation": { "dark": "nord4", "light": "nord0" }
}
}