16 主题
16.1 主题概述
Pi 的 TUI(终端用户界面)使用 JSON 格式的主题文件来定义所有颜色。主题系统支持 24-bit RGB 真彩色、256 色调色板以及终端默认颜色,让你可以根据个人喜好或团队品牌定制 Pi 的视觉风格。
16.2 内置主题
Pi 内置两个主题:
| 主题 | 说明 |
|---|---|
dark |
深色主题(默认,适用于深色终端背景) |
light |
浅色主题(适用于浅色终端背景) |
首次运行时,Pi 会自动检测终端背景色并选择合适的默认主题。
16.3 主题位置
Pi 从以下位置加载主题:
| 位置 | 作用域 |
|---|---|
内置 dark / light |
默认 |
~/.pi/agent/themes/*.json |
全局 |
.pi/themes/*.json |
项目级(需受信任) |
包的 themes/ 目录 |
包级 |
settings.json 的 themes 数组 |
配置 |
--theme <path> |
CLI |
使用 --no-themes 可禁用主题发现。
16.4 选择主题
通过 /settings 命令或 settings.json 选择主题:
{
"theme": "my-theme"
}
Tip
热重载:编辑当前激活的自定义主题文件时,Pi 会自动重新加载,提供即时视觉反馈。这使得主题调试非常方便。
16.5 创建自定义主题
16.5.1 步骤 1:创建主题文件
mkdir -p ~/.pi/agent/themes
vim ~/.pi/agent/themes/my-theme.json16.5.2 步骤 2:定义颜色
{
"$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",
"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",
"bashMode": "#ffaa00"
}
}16.5.3 步骤 3:选择主题
通过 /settings 选择 my-theme。
16.6 主题格式
{
"$schema": "https://raw.githubusercontent.com/earendil-works/pi/.../theme-schema.json",
"name": "my-theme",
"vars": {
"blue": "#0066cc",
"gray": 242
},
"colors": {
"accent": "blue",
"muted": "gray",
"text": "",
...
}
}| 字段 | 说明 |
|---|---|
$schema |
JSON Schema URL,启用编辑器自动补全和验证 |
name |
主题名称(必需,必须唯一,不能包含 /) |
vars |
可选,定义可复用的颜色变量 |
colors |
必须定义全部 51 个必需的颜色 token |
16.7 颜色 Token 分类
16.7.1 核心 UI(11 个颜色)
| Token | 用途 |
|---|---|
accent |
主强调色(Logo、选中项、光标) |
border |
普通边框 |
borderAccent |
高亮边框 |
borderMuted |
微弱边框(编辑器) |
success |
成功状态 |
error |
错误状态 |
warning |
警告状态 |
muted |
次要文本 |
dim |
三级文本 |
text |
默认文本(通常为 "") |
thinkingText |
思考块文本 |
16.7.2 背景与内容(11 个颜色)
| Token | 用途 |
|---|---|
selectedBg |
选中行背景 |
userMessageBg |
用户消息背景 |
userMessageText |
用户消息文本 |
customMessageBg |
扩展消息背景 |
customMessageText |
扩展消息文本 |
customMessageLabel |
扩展消息标签 |
toolPendingBg |
工具框(执行中) |
toolSuccessBg |
工具框(成功) |
toolErrorBg |
工具框(错误) |
toolTitle |
工具标题 |
toolOutput |
工具输出文本 |
16.7.3 Markdown(10 个颜色)
| Token | 用途 |
|---|---|
mdHeading |
标题 |
mdLink |
链接文本 |
mdLinkUrl |
链接 URL |
mdCode |
行内代码 |
mdCodeBlock |
代码块内容 |
mdCodeBlockBorder |
代码块边框 |
mdQuote |
引用块文本 |
mdQuoteBorder |
引用块边框 |
mdHr |
水平分割线 |
mdListBullet |
列表项目符号 |
16.7.4 工具 Diff(3 个颜色)
| Token | 用途 |
|---|---|
toolDiffAdded |
新增行 |
toolDiffRemoved |
删除行 |
toolDiffContext |
上下文行 |
16.7.5 语法高亮(9 个颜色)
| Token | 用途 |
|---|---|
syntaxComment |
注释 |
syntaxKeyword |
关键字 |
syntaxFunction |
函数名 |
syntaxVariable |
变量 |
syntaxString |
字符串 |
syntaxNumber |
数字 |
syntaxType |
类型 |
syntaxOperator |
运算符 |
syntaxPunctuation |
标点符号 |
16.7.6 思考级别边框(6 个必需,1 个可选)
编辑器边框颜色,指示当前思考级别(从微弱到醒目的视觉层次):
| Token | 用途 |
|---|---|
thinkingOff |
思考关闭 |
thinkingMinimal |
最小思考 |
thinkingLow |
低思考 |
thinkingMedium |
中等思考 |
thinkingHigh |
高思考 |
thinkingXhigh |
超高思考 |
thinkingMax |
最大思考(可选,缺省回退到 thinkingXhigh) |
16.7.7 Bash 模式(1 个颜色)
| Token | 用途 |
|---|---|
bashMode |
bash 模式下的编辑器边框(! 前缀) |
16.7.8 HTML 导出(可选)
控制 /export HTML 输出的颜色。省略时从 userMessageBg 推导:
{
"export": {
"pageBg": "#18181e",
"cardBg": "#1e1e24",
"infoBg": "#3c3728"
}
}16.8 颜色值格式
支持四种格式:
| 格式 | 示例 | 说明 |
|---|---|---|
| Hex | "#ff0000" |
6 位十六进制 RGB |
| 256 色 | 39 |
xterm 256 色调色板索引(0-255) |
| 变量引用 | "primary" |
引用 vars 中定义的变量 |
| 终端默认 | "" |
使用终端默认颜色 |
16.8.1 256 色调色板
- 0-15:基本 ANSI 颜色(取决于终端配置)
- 16-231:6×6×6 RGB 立方体(
16 + 36×R + 6×G + B,其中 R、G、B 为 0-5) - 232-255:灰度渐变
16.9 终端兼容性
Pi 使用 24-bit RGB 真彩色。大多数现代终端都支持:
- iTerm2
- Kitty
- WezTerm
- Windows Terminal
- VS Code 集成终端
对于仅支持 256 色的旧终端,Pi 会自动回退到最接近的颜色近似值。
检查真彩色支持:
echo $COLORTERM # 应输出 "truecolor" 或 "24bit"16.10 主题设计技巧
16.10.1 深色终端
使用明亮、饱和的颜色,保持较高对比度:
{
"vars": {
"accent": "#00aaff",
"success": "#00ff88",
"error": "#ff4466"
}
}16.10.2 浅色终端
使用较暗、柔和的颜色,保持较低对比度:
{
"vars": {
"accent": "#0066cc",
"success": "#008844",
"error": "#cc3333"
}
}16.10.3 配色和谐
从成熟的配色方案开始,在 vars 中定义基础调色板:
- Nord:冷色调蓝灰色系
- Gruvbox:暖色调复古风格
- Tokyo Night:深蓝紫色系
- Catppuccin:柔和粉彩风格
- Dracula:深紫暗色系
Tip
VS Code 用户:将 terminal.integrated.minimumContrastRatio 设为 1,以确保主题颜色准确显示,不受 VS Code 对比度调整的影响。
16.11 参考主题
查看 Pi 内置主题作为创建自定义主题的参考: