Windows与WSL的终端美化(六)——Catppuccin主题统一
前面几篇把终端的骨架都搭好了。Windows 侧有 WezTerm 当入口,WSL 里用 Zellij 管工作区,Zsh 和 Starship 把手感接住,常用 CLI 工具也换了一轮。到这一步,功能其实已经够用了,可日常真正在里面待久了,你还是会感觉差一点。
差的那一点,不是功能,而是颜色。
每个工具单看都不难看,可一旦串起来用,窗口、状态栏、提示符、diff、文件预览、模糊搜索还是会像几个人在各说各话。这一篇做的,就是把这些零散的声音收成一套统一语气。主题不只是为了好看,它还决定了你扫一眼信息时累不累,能不能迅速分清背景、正文、强调、错误和成功。
为什么选择 Catppuccin Mocha
我最后选 Catppuccin,不是因为它只是“最近很火”的一套配色,而是因为它的生态实在太完整了。它不是某一个工具上的单点皮肤,而是一整套覆盖终端、提示符、diff viewer、文件管理器和各类 TUI 工具的主题系统。近两年它在终端圈特别常见,GitHub 上的 Catppuccin 组织也已经提供了 50 多个官方 port,这意味着你不是在某个局部单独变好看,而是真的有机会把整条终端链路统一起来。
更关键的是,Catppuccin 不是只给你一堆颜色值,它给的是一套很稳定的语义结构。背景、表面层级、正文、弱化文字、主强调色、错误色、成功色,这些角色在不同工具里都能对应上。你不用每次都重新理解“这个蓝色在这里到底代表链接、激活状态,还是只是作者临时喜欢这个颜色”,认知负担会小很多。
至于为什么是 Mocha,而不是另外三个 flavor,理由也很直接:
- 它是四个 flavor 里最暗的一套,适合长时间看终端。
- 背景够深,但不是那种硬邦邦的纯黑。
- 对比度有层次,阅读舒服,不会亮到刺眼。
- 很多终端工具都直接提供了 Mocha 的现成 port,落地成本低。
对我这种终端停留时间很长的人来说,第一眼惊艳不算最重要,长时间使用还愿意盯着它看,才更值钱。
如果你想看官方项目,可以直接去 Catppuccin 官网:https://catppuccin.com
Catppuccin 的四种 Flavor
Catppuccin 一共提供四种 flavor。它们不是毫无关系的四套散主题,而是共享同一套命名体系和语义结构。也就是说,你今天用 Mocha,明天切到 Latte,背景、表面层、正文、强调色这些角色还是同样的角色,只是具体颜色值换了。
| Flavor | 类型 | 观感 | 适合场景 |
|---|---|---|---|
| Latte | 亮色 | 干净、轻快、对比清晰 | 白天办公、偏亮环境、喜欢浅色界面的人 |
| Frappe | 中深色 | 比 Mocha 更柔一点,层次温和 | 想要深色,但不想太暗 |
| Macchiato | 深色 | 比 Frappe 更沉稳,冷调感更明显 | 喜欢偏冷深色、又不想用最暗配色 |
| Mocha | 最深色 | 安静、稳、耐看,长期阅读舒适 | 终端重度使用、夜间环境、想追求整套深色工作台的人 |
我的选择是 Mocha,因为整个 Windows 与 WSL 终端环境,本来就更适合深色底。WezTerm、Zellij、Starship、bat、delta、fzf、btop、yazi 这条链路一旦统一到 Mocha 上,视觉噪音会明显少很多。
核心色板
下面这张表,就是整套终端主题统一时最值得当作参考基准的一张表。不是每个工具都要把整张色板原封不动抄进去,但至少 background、text、accent、error、success 这些核心语义,最好不要漂移。
| 名称 | Hex | 用途 |
|---|---|---|
| Base | #1e1e2e |
主背景色,终端主体底色 |
| Mantle | #181825 |
深层背景,适合状态栏、标签栏底色 |
| Crust | #11111b |
最深背景,适合高对比底色或最外层深底 |
| Surface0 | #313244 |
一级表面层,选中项、面板块状底色 |
| Surface1 | #45475a |
二级表面层,hover、selection、弱高亮 |
| Surface2 | #585b70 |
三级表面层,边界、分割线、较强高亮 |
| Overlay0 | #6c7086 |
次要文字、不活跃标签、说明信息 |
| Overlay1 | #7f849c |
更弱一层的提示文字、占位信息 |
| Text | #cdd6f4 |
主文字色,正文与主要内容 |
| Subtext0 | #a6adc8 |
副文字、辅助说明、弱化信息 |
| Rosewater | #f5e0dc |
浅暖强调,适合光标、指针、标记 |
| Flamingo | #f2cdcd |
柔和暖色强调,适合轻提醒和点缀 |
| Pink | #f5c2e7 |
粉色强调,适合装饰性高亮与模块区分 |
| Mauve | #cba6f7 |
紫色强调,适合 prompt、模式切换、主提示 |
| Red | #f38ba8 |
错误、警告、删除、高风险提示 |
| Maroon | #eba0ac |
次级暖色强调,适合提醒与状态提示 |
| Peach | #fab387 |
橙色强调,适合 mode、tab、提醒信息 |
| Yellow | #f9e2af |
黄色强调,适合注意项、聚焦高亮 |
| Green | #a6e3a1 |
成功、通过、Git 新增、正常状态 |
| Teal | #94e2d5 |
清爽辅助强调,适合次级状态标识 |
| Sky | #89dceb |
轻量信息强调,适合提示和视觉提亮 |
| Sapphire | #74c7ec |
信息类强调,适合链接、统计、信息块 |
| Blue | #89b4fa |
主强调色,激活状态、当前项、主按钮感 |
| Lavender | #b4befe |
次强调色,适合柔和分层与辅助强调 |
真正好用的主题统一,不是每个工具都必须长得一模一样,而是同一种颜色语义在不同地方都保持稳定。比如背景始终是 Base,正文始终是 Text,错误始终是 Red,成功始终是 Green,主强调色尽量维持在 Blue 或 Mauve 这一组。只要这几条不乱,整套环境就会像一个系统。
各工具主题配置一览
为了后面查起来方便,我先把整条链路里各个工具的主题入口整理成一张表。你会发现每个工具的写法都不一样,有的是直接写 scheme name,有的是写 flavor name,有的是自己映射一套 hex aliases,但它们最后都指向同一个目标,回到 Mocha 这套语义色板。
| 工具 | 配置方式 | 配置位置 |
|---|---|---|
| WezTerm | config.color_scheme = "Catppuccin Mocha" |
C:\Users\你的用户名\.wezterm.lua |
| Zellij | theme "catppuccin-mocha" |
~/.config/zellij/config.kdl |
| zjstatus | color_* aliases 映射到 Mocha hex |
~/.config/zellij/layouts/dev.kdl |
| Starship | starship preset catppuccin-powerline -o ~/.config/starship.toml |
~/.config/starship.toml |
| bat | 安装 Catppuccin 主题文件,并设置 BAT_THEME="Catppuccin Mocha" |
~/.zshrc + $(bat --config-dir)/themes |
| delta | 在 .gitconfig 里设置 syntax-theme = "Catppuccin Mocha" |
~/.gitconfig |
| fzf | 在 FZF_DEFAULT_OPTS 里写 Mocha 配色 |
~/.zshrc |
| btop | 使用内置主题选择器切到 catppuccin_mocha |
btop 程序内 |
| yazi | 使用 flavor 配置 use = "catppuccin-mocha" |
~/.config/yazi/theme.toml |
各工具的具体配置方法
下面这一段,就是整篇最实用的部分。前面的原则讲的是为什么,后面这些配置才是真正把主题落到每个工具上的方法。
WezTerm,color_scheme 统一入口
WezTerm 是 Windows 侧的第一层入口,所以它的底色很重要。最直接的写法,就是在 C:\Users\你的用户名\.wezterm.lua 里指定内置的 Catppuccin Mocha:
config.color_scheme = "Catppuccin Mocha"
如果你沿用了前一篇里那套双模式配置,也就是 Mocha Glass 和 Mocha Contrast,本质上还是从内置的 Catppuccin Mocha 派生出来的。对应思路大概是这样:
local wezterm = require "wezterm"
local scheme = wezterm.color.get_builtin_schemes()["Catppuccin Mocha"]
config.color_schemes = {
["Mocha Glass"] = scheme,
}
config.color_scheme = "Mocha Glass"
也就是说,WezTerm 这一层要么直接用 Catppuccin Mocha,要么在它的基础上派生自己的变体。无论你选哪种写法,核心都别变,背景和语义色应该还是来自 Mocha。
Zellij,theme 直接收口
Zellij 的主题入口很干脆,直接在 ~/.config/zellij/config.kdl 里写一行 theme 就行:
theme "catppuccin-mocha"
default_layout "dev"
default_shell "zsh"
pane_frames false
simplified_ui true
copy_on_select true
scrollback_editor "/usr/bin/nvim"
mouse_mode true
这里真正和主题统一直接相关的,是第一行 theme "catppuccin-mocha"。剩下几项虽然不直接决定配色,但会影响视觉观感。比如 pane_frames false 会让界面更干净,simplified_ui true 也更适合后面接上 zjstatus 的状态栏。
zjstatus,用 color aliases 锁住语义色
zjstatus 是 Zellij 里最值得单独处理的一层,因为它不是简单切主题名,而是自己在 layout 里用一组 aliases 把颜色语义重新定义出来。这样做好处很明显,mode、session、tabs、git branch、time 这些状态信息,都会明确回到同一套 Mocha 色板。
前提是先把插件放到固定路径:
mkdir -p ~/.config/zellij/plugins
curl -L https://github.com/dj95/zjstatus/releases/latest/download/zjstatus.wasm \
-o ~/.config/zellij/plugins/zjstatus.wasm
然后在 ~/.config/zellij/layouts/dev.kdl 里这样写:
plugin location="file:~/.config/zellij/plugins/zjstatus.wasm" {
color_bg "#1e1e2e"
color_fg "#cdd6f4"
color_blue "#89b4fa"
color_green "#a6e3a1"
color_red "#f38ba8"
color_peach "#fab387"
color_mauve "#cba6f7"
color_surface "#313244"
color_overlay "#6c7086"
format_left "{mode} #[fg={blue},bold]{session}"
format_center "{tabs}"
format_right "{command_git_branch} {datetime}"
mode_normal "#[bg={green},fg={bg},bold] NORMAL "
mode_locked "#[bg={red},fg={bg},bold] LOCKED "
mode_pane "#[bg={blue},fg={bg},bold] PANE "
mode_tab "#[bg={peach},fg={bg},bold] TAB "
mode_resize "#[bg={mauve},fg={bg},bold] RESIZE "
tab_normal "#[fg={overlay}] {name} "
tab_active "#[fg={blue},bold,italic] {name} "
command_git_branch_command "git rev-parse --abbrev-ref HEAD"
command_git_branch_format "#[fg={green}] {stdout}"
command_git_branch_interval "5"
datetime "#[fg={overlay},bold] {format} "
datetime_format "%H:%M"
datetime_timezone "Asia/Shanghai"
}
这段配置的关键,不在于每一项都多复杂,而在于它把“颜色的含义”钉死了。Green 就是正常模式和 Git 分支信息,Red 就是锁定或风险状态,Blue 是激活态,Overlay 是弱化信息。状态栏一旦这样定下来,整套界面会稳很多。
Starship,用 preset 快速接入 Catppuccin
Starship 这层最省心,因为它已经有现成的 Catppuccin Powerline preset。直接运行下面这条命令,就能把 ~/.config/starship.toml 生成出来:
starship preset catppuccin-powerline -o ~/.config/starship.toml
这个 preset 会把常用模块都排好,包括 OS 图标、用户名、目录、Git branch 和状态、语言版本、时间、命令耗时等。每个模块都用 Catppuccin 的分段颜色铺开,再用 powerline 形态连起来,和 WezTerm、Zellij 这一套深色底非常搭。
如果你前一篇已经在 ~/.zshrc 里接好了 Starship 初始化,那这里基本不需要再手改很多内容:
eval "$(starship init zsh)"
bat,安装主题文件,再用环境变量指定
bat 这层别只写环境变量,主题文件也得先装进去,不然名字设了也找不到。比较稳的做法是两步走。
先在 ~/.zshrc 里接管 cat 并声明主题:
alias cat='bat'
export BAT_THEME="Catppuccin Mocha"
再把 Catppuccin Mocha 的主题文件装到 bat 的主题目录里:
mkdir -p "$(bat --config-dir)/themes"
curl -L https://github.com/catppuccin/bat/raw/main/themes/Catppuccin%20Mocha.tmTheme \
-o "$(bat --config-dir)/themes/Catppuccin Mocha.tmTheme"
bat cache --build
如果你用的是 Ubuntu 或 Debian 系自带的软件包,还要注意一个常见小坑,系统里它经常叫 batcat。这种情况下可以补一个软链接:
ln -s /usr/bin/batcat ~/.local/bin/bat
这样一来,bat 看配置文件、脚本、Markdown 时就会回到同一套 Mocha 语气里,不会跟前面的终端层脱节。
delta,在 .gitconfig 里接管 diff 视图
delta 是 Git 体验里非常值的一步。它不只是把 diff 染色,更重要的是把改动的层次感拉出来。把下面这段加到 ~/.gitconfig 就行:
[core]
pager = delta
[interactive]
diffFilter = delta --color-only
[delta]
navigate = true
side-by-side = true
line-numbers = true
syntax-theme = "Catppuccin Mocha"
[merge]
conflictstyle = diff3
这里和主题直接相关的是 syntax-theme = "Catppuccin Mocha",其他几项则是为了把阅读体验一并拉上来。side-by-side 配合 line-numbers 很适合看小改动,navigate = true 也更适合终端里做 review。
顺手补一句,很多包管理器里它的安装名其实叫 git-delta,如果你在 apt 里找不到 delta,通常应该装这个:
sudo apt install git-delta
fzf,用环境变量把弹窗配色收回来
fzf 特别容易被忽略,因为它常常只是一下弹出来,又一下消失。可它越是高频短暂,越值得配色统一。把下面这段放进 ~/.zshrc:
export FZF_DEFAULT_OPTS=" \
--color=bg+:#313244,bg:#1e1e2e,spinner:#f5e0dc,hl:#f38ba8 \
--color=fg:#cdd6f4,header:#f38ba8,info:#cba6f7,pointer:#f5e0dc \
--color=marker:#f5e0dc,fg+:#cdd6f4,prompt:#cba6f7,hl+:#f38ba8"
这段映射里,背景回到 Base,选中项背景用 Surface0,正文是 Text,提示和高亮用 Mauve、Red、Rosewater 这几组。这样你在筛文件、切目录、回忆历史命令时,视觉不会突然跳到另一套语言里去。
btop,直接选内置主题
btop 属于最好收尾的一类工具,因为它本身就内置了 Catppuccin 主题,不需要额外下载主题文件。启动以后这样切就行:
Esc -> Options -> Theme -> catppuccin_mocha
这一步做完后,CPU、内存、磁盘、进程这些高密度信息会马上顺眼很多。它的好处不只是“颜色统一了”,而是信息块之间的区分会更自然,扫一眼就能抓到重点。
yazi,用 flavor system 接上 Catppuccin
yazi 的主题系统很适合做统一,因为它原生就支持 flavor 概念。先把 Catppuccin 的 flavor 文件放进 ~/.config/yazi/flavors:
mkdir -p ~/.config/yazi/flavors
git clone https://github.com/yazi-rs/flavors.git /tmp/yazi-flavors
cp -r /tmp/yazi-flavors/catppuccin-mocha.yazi ~/.config/yazi/flavors/
rm -rf /tmp/yazi-flavors
然后创建 ~/.config/yazi/theme.toml:
[flavor]
use = "catppuccin-mocha"
这样一来,目录列表、选中态、预览区和各种状态提示都会切到 Mocha 上。yazi 本来就很适合和 fd、fzf、zoxide 一起用,主题统一后,它就不再像一个临时插进来的文件管理器,而是整套工作流里很自然的一段。
主题一致性检查清单
改完以后,我更建议你做一次“语义检查”,而不是盯着每个工具看细枝末节。下面这份清单就很好用:
- WezTerm 背景色与 Zellij 背景色一致,都是
#1e1e2e - zjstatus 状态栏颜色使用了 Mocha 色板的 color aliases
- Starship prompt 使用 Catppuccin 风格的配色映射
- bat 语法高亮使用
Catppuccin Mocha主题 - delta diff 视图使用
Catppuccin Mochasyntax theme - fzf 弹出窗口使用 Mocha 配色
- btop 已切到
catppuccin_mocha - yazi 已加载
catppuccin-mochaflavor - 所有工具的错误语义尽量统一到 Red,
#f38ba8 - 所有工具的成功语义尽量统一到 Green,
#a6e3a1
如果你时间有限,最先看的不是每个工具所有小细节,而是这几项有没有稳住。背景统一不统一,正文清不清楚,激活态是不是始终有同一组强调色,错误和成功有没有在不同工具里乱跑。只要这些核心语义稳定下来,整套环境就会像一个完整系统,而不是几套主题的临时拼盘。
如何切换到其他 Catppuccin Flavor
Catppuccin 的一个很大优点,就是之后如果你想从 Mocha 切到 Latte、Frappe 或 Macchiato,整体方法不用推倒重来。结构和语义还是同一套,你改的主要只是 flavor 名称,以及少数手写 hex 的地方。
可以按下面这张表改:
| 工具 | 从 Mocha 切到其他 Flavor 的方法 |
|---|---|
| WezTerm | 把 Catppuccin Mocha 改成 Catppuccin Latte、Catppuccin Frappe 或 Catppuccin Macchiato。如果你用自定义 scheme,就把底层引用的 built-in scheme 名称一起改掉。 |
| Zellij | 把 theme "catppuccin-mocha" 改成对应的 catppuccin-latte、catppuccin-frappe、catppuccin-macchiato。 |
| zjstatus | 保留 alias 结构不变,把每个 alias 的 hex 值替换成目标 flavor 的对应颜色。 |
| Starship | 重新生成 Catppuccin preset,或者直接把 starship.toml 里 palette 相关色值替换成目标 flavor。 |
| bat | 把 BAT_THEME="Catppuccin Mocha" 改成对应 flavor 的主题名,并确保相应 tmTheme 文件已经安装。 |
| delta | 把 syntax-theme = "Catppuccin Mocha" 改成对应 flavor 名称。 |
| fzf | 保留 FZF_DEFAULT_OPTS 结构,把里面手写的 Mocha hex 统一替换成目标 flavor 的对应值。 |
| btop | 在内置主题列表里切到 catppuccin_latte、catppuccin_frappe 或 catppuccin_macchiato。 |
| yazi | 把 use = "catppuccin-mocha" 改成对应 flavor,并把相应 flavor 文件复制到 ~/.config/yazi/flavors/。 |
这里最省事的一类工具,是 WezTerm、Zellij、bat、delta、btop、yazi 这种“直接认 flavor 名称”的。最需要手动改的,是 zjstatus、fzf 这种把 hex 写死在配置里的,还有 Starship 这种通常会生成一份 preset 再落到本地文件中的。
不管切到哪一个 flavor,最后都别忘了把上面的主题一致性检查清单重新过一遍。结构可以不变,语义一定要稳。
其他可选主题
如果你以后不想继续用 Catppuccin,也不是没别的选择。终端圈里还有几套长期流行、生态也不错的主题,各有各的气质。
- Tokyo Night:偏蓝冷调,现代感很强,很多开发者会喜欢它那种清爽又克制的感觉。
- Dracula:经典到几乎人人都见过,紫调明显,辨识度很高。
- Nord:冷灰蓝路线,安静、克制,适合喜欢低饱和风格的人。
- Gruvbox:暖色、复古、带一点颗粒感气质,很多人一用就离不开。
- Rose Pine:柔和粉紫调,整体更温柔,也很适合拿来做整套深色工作台。
这些主题大多也覆盖了终端、编辑器和常见 CLI 工具,不过如果你是想做一套跨 Windows 与 WSL、从终端窗口一直统一到 prompt、diff、文件管理器的完整方案,Catppuccin 目前依然是最省心、最完整的一套。
系列总结
写到这里,这个系列也就真正收口了。
前面几篇做的事情,其实一直都指向同一个目标。先把 WSL 这层地基打稳,再把 WezTerm 这个 Windows 入口调顺,然后交给 Zellij 管布局和会话,用 Zsh 与 Starship 把交互手感接起来,再把 bat、delta、fzf、btop、yazi 这些高频工具换成更顺手的版本。到了这一篇,做的不是再装新东西,而是把前面所有零件的颜色、层次和语气彻底对齐。
我很喜欢这种收尾方式。它没有引入新的复杂度,只是把原本已经不错的体验,真正拧成了一股绳。等颜色不再各说各话之后,Windows 是入口,WSL 是工作现场,WezTerm、Zellij、Starship 和一整套 CLI 工具才终于像同一张桌子上的一组工具。
至少对我来说,这套终端环境已经不再是“临时能用”的配置集合了。它更像一个长期会待在里面工作的地方,安静、稳定、顺手,也足够耐看。
Comments (0)
No comments yet. Be the first!