主题
pi 可以创建主题。让它为你的配置构建一个。
主题是定义 TUI 颜色的 JSON 文件。
目录 Table of Contents
- 位置 Locations
- 选择主题 Selecting a Theme
- 创建自定义主题 Creating a Custom Theme
- 主题格式 Theme Format
- 颜色令牌 Color Tokens
- 颜色值 Color Values
- 提示 Tips
位置 Locations
Pi 从以下位置加载主题:
- 内置 Built-in:
dark、light - 全局 Global:
~/.pi/agent/themes/*.json - 项目 Project:
.pi/themes/*.json(仅在项目被信任后) - 包 Packages:
themes/目录或package.json中的pi.themes条目 - 设置 Settings:包含文件或目录的
themes数组 - CLI:
--theme <path>(可重复)
使用 --no-themes 禁用发现。
选择主题 Selecting a Theme
通过 /settings 或在 settings.json 中选择主题:
{
"theme": "my-theme"
}首次运行时,pi 会检测你的终端背景,并默认使用 dark 或 light。
创建自定义主题 Creating a Custom Theme
- 创建主题文件:
mkdir -p ~/.pi/agent/themes
vim ~/.pi/agent/themes/my-theme.json- 使用所有必需颜色定义主题(请参阅颜色令牌 Color Tokens):
{
"$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",
"thinkingMax": "#ff0088",
"bashMode": "#ffaa00"
}
}- 通过
/settings选择主题。
**热重载 Hot reload:**当你编辑当前激活的自定义主题文件时,pi 会自动重新加载,实现即时视觉反馈。
主题格式 Theme Format
{
"$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": "",
...
}
}name是必需的,必须唯一,且不能包含/。vars是可选的。在此处定义可复用的颜色,然后在colors中引用它们。colors必须定义全部 51 个必需的令牌。thinkingMax是可选的,在不设置时会回退到thinkingXhigh。
$schema 字段支持编辑器自动补全和验证。
颜色令牌 Color Tokens
每个主题必须定义全部 51 个必需的颜色令牌。thinkingMax 为可选,用于兼容现有主题;省略时使用 thinkingXhigh。
核心 UI Core UI(11 色)
| Token | Purpose 用途 |
|---|---|
accent | 主要强调色(标志、选中项、光标) |
border | 普通边框 |
borderAccent | 高亮边框 |
borderMuted | 弱化边框(编辑器) |
success | 成功状态 |
error | 错误状态 |
warning | 警告状态 |
muted | 次要文本 |
dim | 第三级文本 |
text | 默认文本(通常为 "") |
thinkingText | 思考块文本 |
背景与内容 Backgrounds & Content(11 色)
| Token | Purpose 用途 |
|---|---|
selectedBg | 选中行背景 |
userMessageBg | 用户消息背景 |
userMessageText | 用户消息文本 |
customMessageBg | 扩展消息背景 |
customMessageText | 扩展消息文本 |
customMessageLabel | 扩展消息标签 |
toolPendingBg | 工具框(等待中) |
toolSuccessBg | 工具框(成功) |
toolErrorBg | 工具框(错误) |
toolTitle | 工具标题 |
toolOutput | 工具输出文本 |
Markdown(10 色)
| Token | Purpose 用途 |
|---|---|
mdHeading | 标题 |
mdLink | 链接文本 |
mdLinkUrl | 链接 URL |
mdCode | 行内代码 |
mdCodeBlock | 代码块内容 |
mdCodeBlockBorder | 代码块围栏 |
mdQuote | 块引用文本 |
mdQuoteBorder | 块引用边框 |
mdHr | 水平分隔线 |
mdListBullet | 列表圆点 |
工具差异 Tool Diffs(3 色)
| Token | Purpose 用途 |
|---|---|
toolDiffAdded | 添加的行 |
toolDiffRemoved | 删除的行 |
toolDiffContext | 上下文行 |
语法高亮 Syntax Highlighting(9 色)
| Token | Purpose 用途 |
|---|---|
syntaxComment | 注释 |
syntaxKeyword | 关键字 |
syntaxFunction | 函数名 |
syntaxVariable | 变量 |
syntaxString | 字符串 |
syntaxNumber | 数字 |
syntaxType | 类型 |
syntaxOperator | 操作符 |
syntaxPunctuation | 标点 |
思考级别边框 Thinking Level Borders(6 必需,1 可选)
编辑器边框颜色,用于指示思考级别(从弱到强的视觉层次):
| Token | Purpose 用途 |
|---|---|
thinkingOff | 思考关闭 |
thinkingMinimal | 最低思考 |
thinkingLow | 低思考 |
thinkingMedium | 中等思考 |
thinkingHigh | 高思考 |
thinkingXhigh | 极高思考 |
thinkingMax | 最高思考;可选,回退到 thinkingXhigh |
Bash 模式 Bash Mode(1 色)
| Token | Purpose 用途 |
|---|---|
bashMode | Bash 模式下的编辑器边框(! 前缀) |
HTML 导出 HTML Export(可选)
export 部分控制 /export HTML 输出的颜色。如果省略,颜色将从 userMessageBg 派生。
{
"export": {
"pageBg": "#18181e",
"cardBg": "#1e1e24",
"infoBg": "#3c3728"
}
}颜色值 Color Values
支持四种格式:
| 格式 Format | 示例 Example | 描述 Description |
|---|---|---|
| Hex | "#ff0000" | 6 位十六进制 RGB |
| 256 色 256-color | 39 | xterm 256 色调色板索引(0-255) |
| 变量 Variable | "primary" | 引用 vars 中的条目 |
| 默认 Default | "" | 终端的默认颜色 |
256 色调色板 256-Color Palette
0-15:基本 ANSI 颜色(依赖终端)16-231:6×6×6 RGB 立方体(16 + 36×R + 6×G + B,其中 R、G、B 的取值范围为 0-5)232-255:灰度渐变
终端兼容性 Terminal Compatibility
Pi 使用 24 位 RGB 颜色。大多数现代终端都支持此格式(iTerm2、Kitty、WezTerm、Windows Terminal、VS Code)。对于仅支持 256 色的旧终端,pi 会回退到最接近的近似值。
检查 truecolor 支持:
echo $COLORTERM # 应输出 "truecolor" 或 "24bit"提示 Tips
**深色终端 Dark terminals:**使用明亮、饱和的颜色,并保持较高对比度。
**浅色终端 Light terminals:**使用较深、柔和的颜色,并保持较低对比度。
**色彩和谐 Color harmony:**从基础调色板(Nord、Gruvbox、Tokyo Night)开始,在 vars 中定义并一致引用。
**测试 Testing:**使用不同的消息类型、工具状态、Markdown 内容和长文本换行来检查你的主题。
**VS Code:**将 terminal.integrated.minimumContrastRatio 设置为 1 以获得准确的颜色。
示例 Examples
查看内置主题: