Skip to content

5.6a 主题系统

33 个内置 JSON 主题随意切换,终端可用时还会生成 system 主题。

📝 课程笔记

本课核心知识点整理:

主题系统学霸笔记

学完你能做什么

  • 切换和设置主题
  • 理解主题加载优先级
  • 创建自定义主题
  • 配置 TUI 滚动和 Diff 样式

终端要求

主题需要终端支持 truecolor(24位色):

bash
# 检查支持
echo $COLORTERM  # 应输出 truecolor 或 24bit

# 如不支持,添加到 shell 配置
export COLORTERM=truecolor

兼容性说明

  • 支持:iTerm2、Alacritty、Kitty、Windows Terminal、GNOME Terminal(新版)
  • 不支持 truecolor 时,主题会降级到 256 色近似

切换主题

/themes

或使用快捷键:Ctrl+XT


内置主题

OpenCode 内置 33 个静态 JSON 主题。终端颜色可用时,还会额外生成一个 system 主题:

主题风格来源
opencode默认主题,橙色调OpenCode 原创
system自适应终端配色特殊
tokyonight暗色,蓝紫调tokyonight.nvim
catppuccin暗色,柔和粉调Catppuccin
catppuccin-macchiato暗色,Macchiato 变体Catppuccin
catppuccin-frappe暗色,Frappe 变体Catppuccin
gruvbox暗色,复古暖调Gruvbox
nord暗色,北欧冷调Nord
everforest暗色,自然绿Everforest
ayu暗色,Ayu 风格Ayu
carbonfox暗色,Carbonfox 风格Nightfox
kanagawa暗色,日式水墨Kanagawa
one-dark暗色,Atom 风格Atom One
dracula暗色,紫色调Dracula
matrix黑客风格绿经典
monokai暗色,经典 MonokaiMonokai
material暗色,Material DesignMaterial
solarized暗色/亮色,SolarizedSolarized
palenight暗色,紫蓝调Palenight
nightowl暗色,适合夜间Night Owl
rosepine暗色,玫瑰调Rose Pine
synthwave84复古霓虹风Synthwave '84
cobalt2暗色,钴蓝调Cobalt2
githubGitHub 风格GitHub
vercel暗色,Vercel 风格Vercel
cursor暗色,Cursor 风格Cursor
vesper暗色,柔和Vesper
aura暗色,紫色调Aura
flexoki暗色,柔和墨水调Flexoki
zenburn暗色,低对比度护眼Zenburn
mercury暗色,银灰调Mercury
orng暗色,橙色调OpenCode
lucent-orng暗色,明亮橙色调OpenCode
osaka-jade暗色,翡翠绿调OpenCode

输入 /themes 可实时预览当前可用的主题效果。


System 主题

system 是特殊主题,自动适配终端配色:

  • 自动生成灰度:根据终端背景色生成最佳对比度的灰度
  • 使用 ANSI 颜色:使用标准 ANSI 颜色(0-15),跟随终端配色
  • 保留终端默认:文字和背景使用 none,保持终端原生外观

适合人群

  • 希望 OpenCode 匹配终端外观的用户
  • 使用自定义终端配色方案的用户
  • 追求所有终端程序风格统一的用户
jsonc
{
  "$schema": "https://opencode.ai/tui.json",
  "theme": "system"
}

配置默认主题

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

注意:把这段保存为 tui.jsontui.jsonc。推荐把 theme 直接写在 TUI 配置顶层。不要把 tui.theme 写进主 opencode.json;独立 TUI 配置仍兼容嵌套的旧写法,但不推荐继续使用。

从旧版本升级时,启动 TUI 会尝试把旧主配置中的 theme 迁到同目录的新 tui.json。同目录已有 tui.json 时会跳过;否则成功写入新文件并创建或复用 <原主配置>.tui-migration.bak 后,才从旧主配置删除 themekeybindstui。只有 tui.jsonc 不会触发跳过。


自定义主题

主题加载顺序

优先级从低到高(后加载的覆盖前面的):

  1. 内置主题 - 嵌入二进制文件中
  2. 用户配置目录 - ~/.config/opencode/themes/*.json$XDG_CONFIG_HOME/opencode/themes/*.json
  3. 沿途 .opencode/themes - 从当前目录向父目录遍历并加载

同名主题会被覆盖。例如创建 ~/.config/opencode/themes/tokyonight.json 可以覆盖内置主题。多个沿途 .opencode/themes 定义同名主题时,更靠父级的目录后加载并取胜,不要假设当前目录一定优先。

创建主题

用户全局主题

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

项目专属主题

bash
mkdir -p .opencode/themes
vim .opencode/themes/my-theme.json

主题 JSON 格式

jsonc
{
  "$schema": "https://opencode.ai/theme.json",
  "defs": {
    // 颜色定义(可选),用于复用
    "bg": "#1a1b26",
    "fg": "#c0caf5",
    "blue": "#7aa2f7",
    "green": "#9ece6a",
    "red": "#f7768e"
  },
  "theme": {
    // 必须定义的颜色属性
    "primary": { "dark": "blue", "light": "#3b7dd8" },
    "text": { "dark": "fg", "light": "#1a1a1a" },
    "background": { "dark": "bg", "light": "#ffffff" }
    // ... 其他属性
  }
}

颜色格式

格式示例说明
Hex"#ffffff"标准十六进制颜色
ANSI30-255 ANSI 颜色码
引用"primary"引用 defs 中定义的颜色
明暗变体{"dark": "#000", "light": "#fff"}深色/浅色模式分别设置
无色"none"使用终端默认色(透明)

完整主题属性

主题包含以下颜色属性。每个必填属性都要提供可解析的值,但不强制使用 dark/light 对象:可以直接写单色、引用或 ANSI 值,也可以用 { dark, light } 分别设置两种模式。

基础颜色

属性说明
primary主色调,用于强调元素
secondary次要色调
accent点缀色
error错误提示色
warning警告提示色
success成功提示色
info信息提示色

文字与背景

属性说明
text主文字颜色
textMuted次要/灰色文字
background主背景色
backgroundPanel面板背景色
backgroundElement元素背景色

边框

属性说明
border普通边框
borderActive激活状态边框
borderSubtle柔和边框

Diff 视图

属性说明
diffAdded新增行文字色
diffRemoved删除行文字色
diffContext上下文行文字色
diffHunkHeaderHunk 头部文字色
diffHighlightAdded新增高亮
diffHighlightRemoved删除高亮
diffAddedBg新增行背景
diffRemovedBg删除行背景
diffContextBg上下文背景
diffLineNumber行号颜色
diffAddedLineNumberBg新增行号背景
diffRemovedLineNumberBg删除行号背景

Markdown 渲染

属性说明
markdownText正文
markdownHeading标题
markdownLink链接 URL
markdownLinkText链接文字
markdownCode行内代码
markdownBlockQuote引用块
markdownEmph斜体
markdownStrong粗体
markdownHorizontalRule水平线
markdownListItem列表标记
markdownListEnumeration有序列表数字
markdownImage图片链接
markdownImageText图片说明
markdownCodeBlock代码块文字

语法高亮

属性说明
syntaxComment注释
syntaxKeyword关键字
syntaxFunction函数名
syntaxVariable变量名
syntaxString字符串
syntaxNumber数字
syntaxType类型
syntaxOperator操作符
syntaxPunctuation标点

完整示例

以 Nord 主题为例:

jsonc
{
  "$schema": "https://opencode.ai/theme.json",
  "defs": {
    "nord0": "#2E3440",
    "nord1": "#3B4252",
    "nord4": "#D8DEE9",
    "nord8": "#88C0D0",
    "nord11": "#BF616A",
    "nord14": "#A3BE8C"
  },
  "theme": {
    "primary": { "dark": "nord8", "light": "#5E81AC" },
    "secondary": { "dark": "#81A1C1", "light": "#81A1C1" },
    "error": { "dark": "nord11", "light": "nord11" },
    "success": { "dark": "nord14", "light": "nord14" },
    "text": { "dark": "nord4", "light": "nord0" },
    "background": { "dark": "nord0", "light": "#ECEFF4" },
    "diffAdded": { "dark": "nord14", "light": "nord14" },
    "diffRemoved": { "dark": "nord11", "light": "nord11" },
    "syntaxKeyword": { "dark": "#81A1C1", "light": "#81A1C1" },
    "syntaxString": { "dark": "nord14", "light": "nord14" }
    // ... 其他属性
  }
}

TUI 配置

除了主题颜色,还可以配置 TUI 行为:

jsonc
{
  "$schema": "https://opencode.ai/tui.json",
  // 滚动速度(最小 0.001)
  "scroll_speed": 3,

  // 滚动加速度(启用后覆盖 scroll_speed)
  "scroll_acceleration": {
    "enabled": true
  },

  // Diff 渲染样式
  // "auto": 根据终端宽度自适应
  // "stacked": 始终单列显示
  "diff_style": "auto"
}

参数说明

参数类型默认值说明
scroll_speednumber3滚动速度,最小 0.001
scroll_acceleration.enabledbooleanfalse启用 macOS 风格滚动加速
diff_style"auto" | "stacked""auto"Diff 渲染样式

注意:启用 scroll_acceleration 后,scroll_speed 设置将被忽略。

以上字段与 theme 一样,都直接写在 tui.json 顶层。源码见 v1.18.22 的 TUI Schema


编辑器设置

OpenCode 支持打开外部编辑器编辑长文本:

bash
# 设置编辑器(添加到 ~/.zshrc 或 ~/.bashrc)
export EDITOR="code --wait"  # VS Code
export EDITOR="cursor --wait" # Cursor
export EDITOR="vim"          # Vim
export EDITOR="nano"         # Nano

在 OpenCode 中使用:

/editor

或快捷键:Ctrl+XE

注意:GUI 编辑器(VS Code、Cursor 等)需要 --wait 参数,让 OpenCode 等待编辑器关闭。


踩坑提醒

现象原因解决
颜色显示不对/降级终端不支持 truecolor设置 COLORTERM=truecolor
/theme 命令不存在命令名错了使用 /themes(有 s)
主题配置不生效写进了主 opencode.json,或沿用不推荐的嵌套写法tui.json 顶层使用 theme
自定义主题没加载路径不对确认放在 .opencode/themes/~/.config/opencode/themes/
编辑器打不开EDITOR 变量不对确认编辑器命令可用,GUI 编辑器加 --wait
滚动太快/太慢默认速度不合适调整 tui.json 顶层的 scroll_speed 或启用加速

本课小结

你学会了:

  1. 使用 /themes 切换 33 个内置 JSON 主题和可用时生成的 system 主题
  2. 理解 system 主题的自适应机制
  3. tui.json 中设置 theme 指定默认主题
  4. 创建自定义主题 JSON 文件
  5. 配置 TUI 滚动和 Diff 样式
  6. 设置外部编辑器

下一课预告

下一课我们将学习快捷键定制。

5.6b 快捷键