本文为社区中文翻译(依据 MIT 协议),阅读英文原文 →。译文可能滞后于上游更新。

主题

主题是定义 TUI 配色的 JSON 文件。

目录

存放位置

Pi 从以下位置加载主题:

--no-themes 禁用发现。

选择主题

通过 /settings 或在 settings.json 中选择:

{
  "theme": "my-theme"
}

首次运行时,Pi 会检测终端背景色,默认选 darklight

初始主题

不改已保存的设置,仅本次运行使用某个主题:

pi --use-theme light

想跟随终端外观,用 亮色主题/暗色主题 语法:

pi --use-theme light/dark

CLI 值只是本次运行的初始主题。之后在 /settings 里选其他主题会立即生效并正常保存。

创建自定义主题

  1. 创建主题文件:
mkdir -p ~/.pi/agent/themes
vim ~/.pi/agent/themes/my-theme.json
  1. 定义主题并包含所有必需颜色(见颜色令牌):
{
  "$schema": "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
  "name": "my-theme",
  "vars": {
    "primary": "#00aaff",
    "secondary": 242
  },
  "colors": {
    "accent": "primary",
    "border": "primary",
    "borderAccent": "#00ffff",
    "borderMuted": "secondary",
    "success": "#00ff00",
    "error": "#ff0000",
    "warning": "#ffff00",
    "muted": "secondary",
    "dim": 240,
    "text": "",
    "thinkingText": "secondary",
    "selectedBg": "#2d2d30",
    "scrollbarTrack": "secondary",
    "scrollbarThumb": "",
    "searchMatchBg": "#2d2d30",
    "searchMatchText": "",
    "userMessageBg": "#2d2d30",
    "userMessageText": "",
    "customMessageBg": "#2d2d30",
    "customMessageText": "",
    "customMessageLabel": "primary",
    "toolPendingBg": "#1e1e2e",
    "toolSuccessBg": "#1e2e1e",
    "toolErrorBg": "#2e1e1e",
    "toolTitle": "primary",
    "toolOutput": "",
    "mdHeading": "#ffaa00",
    "mdLink": "primary",
    "mdLinkUrl": "secondary",
    "mdCode": "#00ffff",
    "mdCodeBlock": "",
    "mdCodeBlockBorder": "secondary",
    "mdQuote": "secondary",
    "mdQuoteBorder": "secondary",
    "mdHr": "secondary",
    "mdListBullet": "#00ffff",
    "toolDiffAdded": "#00ff00",
    "toolDiffRemoved": "#ff0000",
    "toolDiffContext": "secondary",
    "syntaxComment": "secondary",
    "syntaxKeyword": "primary",
    "syntaxFunction": "#00aaff",
    "syntaxVariable": "#ffaa00",
    "syntaxString": "#00ff00",
    "syntaxNumber": "#ff00ff",
    "syntaxType": "#00aaff",
    "syntaxOperator": "primary",
    "syntaxPunctuation": "secondary",
    "thinkingOff": "secondary",
    "thinkingMinimal": "primary",
    "thinkingLow": "#00aaff",
    "thinkingMedium": "#00ffff",
    "thinkingHigh": "#ff00ff",
    "thinkingXhigh": "#ff0000",
    "thinkingMax": "#ff0088",
    "bashMode": "#ffaa00"
  }
}
  1. /settings 中选择该主题。

热重载: 编辑当前正在使用的自定义主题文件时,Pi 会自动重载,立刻看到效果。

主题格式

{
  "$schema": "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
  "name": "my-theme",
  "vars": {
    "blue": "#0066cc",
    "gray": 242
  },
  "colors": {
    "accent": "blue",
    "muted": "gray",
    "text": "",
    "..."
  }
}

$schema 字段可在编辑器中获得自动补全与校验。

颜色令牌

每个主题必须定义全部 53 个必需颜色令牌。可选令牌的存在是为了兼容旧主题:thinkingMax 回退到 thinkingXhighsearchMatchBg 回退到 selectedBgsearchMatchText 回退到 text。其他搜索匹配用 searchMatchBg 底 + searchMatchText 字并加下划线;当前匹配则反转该前景/背景对并加粗。

核心 UI(13 色)

令牌 用途
accent 主强调色(logo、选中项、光标)
border 普通边框
borderAccent 高亮边框
borderMuted 弱边框(编辑器)
success 成功状态
error 错误状态
warning 警告状态
muted 次要文本
dim 三级文本
text 默认文本(通常为 ""
thinkingText 思考块文本
scrollbarTrack 全屏滚动条轨道前景
scrollbarThumb 全屏滚动条滑块前景(普通与展开状态共用)

背景与内容(11 必需 + 2 可选)

令牌 用途
selectedBg 选中行背景
searchMatchBg 记录搜索匹配背景与当前匹配文本;可选,回退 selectedBg
searchMatchText 记录搜索匹配文本与当前匹配背景;可选,回退 text
userMessageBg 用户消息背景
userMessageText 用户消息文本
customMessageBg 扩展消息背景
customMessageText 扩展消息文本
customMessageLabel 扩展消息标签
toolPendingBg 工具框(执行中)
toolSuccessBg 工具框(成功)
toolErrorBg 工具框(错误)
toolTitle 工具标题
toolOutput 工具输出文本

Markdown(10 色)

令牌 用途
mdHeading 标题
mdLink 链接文本
mdLinkUrl 链接 URL
mdCode 行内代码
mdCodeBlock 代码块内容
mdCodeBlockBorder 代码块围栏
mdQuote 引用文本
mdQuoteBorder 引用边框
mdHr 水平分割线
mdListBullet 列表符号

工具 Diff(3 色)

令牌 用途
toolDiffAdded 新增行
toolDiffRemoved 删除行
toolDiffContext 上下文行

语法高亮(9 色)

令牌 用途
syntaxComment 注释
syntaxKeyword 关键字
syntaxFunction 函数名
syntaxVariable 变量
syntaxString 字符串
syntaxNumber 数字
syntaxType 类型
syntaxOperator 运算符
syntaxPunctuation 标点

思考等级边框(6 必需 + 1 可选)

编辑器边框颜色表示思考等级(由弱到强的视觉层级):

令牌 用途
thinkingOff 关闭思考
thinkingMinimal minimal
thinkingLow low
thinkingMedium medium
thinkingHigh high
thinkingXhigh xhigh
thinkingMax max;可选,回退 thinkingXhigh

Bash 模式(1 色)

令牌 用途
bashMode bash 模式(! 前缀)下的编辑器边框

HTML 导出(可选)

export 部分控制 /export HTML 输出的配色。缺省时颜色从 userMessageBg 推导。

{
  "export": {
    "pageBg": "#18181e",
    "cardBg": "#1e1e24",
    "infoBg": "#3c3728"
  }
}

颜色取值

支持四种格式:

格式 示例 说明
十六进制 "#ff0000" 6 位十六进制 RGB
256 色 39 xterm 256 色板索引(0-255)
变量 "primary" 引用 vars 条目
默认 "" 终端默认色

256 色板

终端兼容性

Pi 使用 24 位 RGB 颜色。现代终端大多支持(iTerm2、Kitty、WezTerm、Windows Terminal、VS Code)。只支持 256 色的老终端上,Pi 会回退到最接近的近似色。

检查真彩支持:

echo $COLORTERM  # 应输出 "truecolor" 或 "24bit"

技巧

暗色终端: 用明亮、饱和、对比度高的颜色。

亮色终端: 用更深、柔和、对比度低的颜色。

配色和谐: 从一套基础色板(Nord、Gruvbox、Tokyo Night)出发,在 vars 中定义并统一引用。

测试: 用不同消息类型、工具状态、Markdown 内容和长换行文本检查你的主题。

VS Code:terminal.integrated.minimumContrastRatio 设为 1 以看到真实颜色。

示例

参考内置主题: