← Windows与WSL的终端美化

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 GlassMocha 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 本来就很适合和 fdfzfzoxide 一起用,主题统一后,它就不再像一个临时插进来的文件管理器,而是整套工作流里很自然的一段。

主题一致性检查清单

改完以后,我更建议你做一次“语义检查”,而不是盯着每个工具看细枝末节。下面这份清单就很好用:

  • WezTerm 背景色与 Zellij 背景色一致,都是 #1e1e2e
  • zjstatus 状态栏颜色使用了 Mocha 色板的 color aliases
  • Starship prompt 使用 Catppuccin 风格的配色映射
  • bat 语法高亮使用 Catppuccin Mocha 主题
  • delta diff 视图使用 Catppuccin Mocha syntax theme
  • fzf 弹出窗口使用 Mocha 配色
  • btop 已切到 catppuccin_mocha
  • yazi 已加载 catppuccin-mocha flavor
  • 所有工具的错误语义尽量统一到 Red,#f38ba8
  • 所有工具的成功语义尽量统一到 Green,#a6e3a1

如果你时间有限,最先看的不是每个工具所有小细节,而是这几项有没有稳住。背景统一不统一,正文清不清楚,激活态是不是始终有同一组强调色,错误和成功有没有在不同工具里乱跑。只要这些核心语义稳定下来,整套环境就会像一个完整系统,而不是几套主题的临时拼盘。

如何切换到其他 Catppuccin Flavor

Catppuccin 的一个很大优点,就是之后如果你想从 Mocha 切到 Latte、Frappe 或 Macchiato,整体方法不用推倒重来。结构和语义还是同一套,你改的主要只是 flavor 名称,以及少数手写 hex 的地方。

可以按下面这张表改:

工具 从 Mocha 切到其他 Flavor 的方法
WezTerm Catppuccin Mocha 改成 Catppuccin LatteCatppuccin FrappeCatppuccin Macchiato。如果你用自定义 scheme,就把底层引用的 built-in scheme 名称一起改掉。
Zellij theme "catppuccin-mocha" 改成对应的 catppuccin-lattecatppuccin-frappecatppuccin-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_lattecatppuccin_frappecatppuccin_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 工具才终于像同一张桌子上的一组工具。

至少对我来说,这套终端环境已经不再是“临时能用”的配置集合了。它更像一个长期会待在里面工作的地方,安静、稳定、顺手,也足够耐看。

系列文章导航

  1. Windows与WSL的终端美化(零)——系列概览
  2. Windows与WSL的终端美化(一)——WSL安装与配置
  3. Windows与WSL的终端美化(二)——WezTerm配置
  4. Windows与WSL的终端美化(三)——Zellij工作区管理
  5. Windows与WSL的终端美化(四)——Shell与Prompt配置
  6. Windows与WSL的终端美化(五)——CLI工具链美化
  7. Windows与WSL的终端美化(六)——Catppuccin主题统一(本篇)
目录

Comments (0)

No comments yet. Be the first!