Qiuyu Site

Back

macOS 终端配置(二):主题美化Blur image

目标#

构建一个实用高效的终端开发环境,支持 AI Agent 辅助编程,完善的远程 SSH 开发体验,以及跨设备的工作流同步。
当然也要酷炫好看,参考头图!
我的配置repo,涉及到的配置文件都在此仓库中,欢迎参考。

本篇博客将介绍终端美化,其他内容见:

  1. macOS 终端配置(一):架构与工具
  2. macOS 终端配置(二):主题美化

主题美化#

目标是打造统一的 Neon/Glow 风格:暗色底调 + 半透明毛玻璃背景 + 高亮发光的文字与边框。

渲染层级说明:#

Ghostty → TUI 程序(Neovim / btop)

Ghostty 作为最外层的终端模拟器,负责渲染终端背景、透明度和字体。当你在其中打开 Neovim 或 btop 时,这些程序会绘制自己的前景内容——但底层的透明与模糊效果始终来自 Ghostty。

策略:所有工具统一使用我非常喜欢的 Catppuccin Macchiato,在 Ghostty 中实现透明和 Neon/Glow 等效果。Catppuccin Macchiato配色暗而不沉、色调饱和度恰到好处,天然契合透明和 Neon,且社区生态完善,几乎所有主流工具都有现成的配置 Port。

Catppuccin 官网的 Ports 列表 收录了大量社区贡献的工具主题,基本上用到的工具都能在里面找到。

第一步:各工具主题统一#

1. Ghostty#

编辑 ~/.config/ghostty/config

theme = Catppuccin Macchiato
plaintext

alt text

2. Starship#

# 一键生成 Catppuccin Powerline 预设
starship preset catppuccin-powerline -o ~/.config/starship.toml
bash

生成后编辑 ~/.config/starship.toml,将默认的 mocha 改为 macchiato

palette = 'catppuccin_macchiato'
toml

alt text

3. LazyVim / Neovim#

LazyVim 默认内置了 Catppuccin 插件。编辑 ~/.config/nvim/lua/plugins/colorscheme.lua,以下写法支持在多个主题间快速切换,修改顶部的 theme 变量即可:

alt text

4. Yazi#

配置较长,参考官方仓库:catppuccin/yazi alt text

5. Fastfetch#

fastfetch --gen-config  # 生成默认配置文件
bash

编辑 ~/.config/fastfetch/config.jsonc,替换为以下内容,应用 Macchiato 调色:

alt text

6. btop#

创建主题目录并新建主题文件:

mkdir -p ~/.config/btop/themes
nano ~/.config/btop/themes/catppuccin_macchiato.theme
bash

粘贴以下内容:

进入 btop 后:ESC → Options → Color theme,选择 catppuccin_macchiatoalt text

第二步:Ghostty 透明与 Neon 效果#

1. Ghostty 配置#

这是实现毛玻璃透明 + Neon 发光感的核心配置层。编辑 ~/.config/ghostty/config

2. TUI 程序背景穿透#

Ghostty 的透明度只作用于自身的背景层。Neovim、btop 等 TUI 程序默认会绘制实色背景,会把底层的透明效果遮住。需要单独让它们”放弃”自己的背景色,透出 Ghostty 的透明层。

btop:一行命令修改配置:

sed -i '' 's/theme_background = true/theme_background = false/' ~/.config/btop/btop.conf
bash

Neovim:在 colorscheme 配置中开启 transparent_background = true,已包含在第一步的 Neovim 配置里,无需重复操作。 alt text

第三步(进阶):Shader 与光标动画#

前面的配置属于静态美化层——颜色统一、背景透明。想要更进一步,让光标跳跃时有拖尾发光效果、画面带有 Bloom/Glow 质感,需要进入 Ghostty 的 Shader 层

1. 原理#

Ghostty 支持在 GPU 渲染管线末尾注入自定义 GLSL 片段着色器custom-shader),对终端的最终输出画面做像素级后处理。由于它作用于 Ghostty 整个渲染帧,效果是全局的——Neovim、btop、普通 Shell 皆可受益,无需对每个程序单独配置。

# ~/.config/ghostty/config
custom-shader = ~/.config/ghostty/shaders/your-shader.glsl
custom-shader-animation = true  # 启用时间驱动动画(光标拖尾、闪烁效果等)
plaintext

2. 获取 Shader#

GitHub 上有大量社区贡献的 Ghostty shader,搜索 ghostty shaders 即可找到。我把常用仓库直接 clone 到 Ghostty 配置目录下统一管理,自己写的 shader 也放在同一目录,这样所有 shader 集中在 ~/.config/ghostty/shaders/推荐shader仓库

3. 霓虹/辉光 Shader#

「霓虹/辉光」的效果,就是通过这个 shader 实现的。

基于社区 glow-rgbsplit-twitchy.glsl 改写,主要改动:色散改为平滑动画(去掉原版过强的随机抖动噪声)、完整保留 Ghostty 背景透明的 alpha 通道、集中参数便于调整。

效果由三层叠加构成:

  • 文字增亮:亮度超过阈值的像素(文字本身)在 Oklab 色彩空间中直接提升明度,呈现清脆的霓虹质感
  • Glow 扩散:暗像素向周围 24 个邻居螺旋采样(权重随距离衰减),将邻近亮像素的颜色和亮度「渗入」当前像素,形成柔和的彩色光晕
  • RGB 色散:对 R/B 通道分别向左/右微量偏移采样,模拟镜头色差,增加赛博感;色散量随时间缓慢波动,不会死板
  • 透明度保留:alpha passthrough,不破坏 Ghostty 的背景透明效果

颜色空间:所有亮度判断和 glow 计算均在 Oklab(感知均匀色彩空间)中完成,避免直接操作 sRGB 导致的色调偏移——glow 扩散后颜色依然准确、无偏色。

顶部可调参数:

const float ABERRATION_STRENGTH = 0.008; // 色散强度,0.0 = 无,0.008 = 微弱,0.05 = 原版强度
const float ABERRATION_SPEED    = 0.8;   // 色散抖动速度,0.0 = 完全静止
const float ABERRATION_AMPLITUDE= 0.3;   // 色散抖动幅度,0.0 = 恒定不变
const float TEXT_BRIGHTNESS     = 1.2;   // 文字自身亮度倍数,1.0 = 不增强,1.5 = 极亮
const float GLOW_RADIUS         = 1.414; // Glow 扩散半径(像素),越大光晕越宽
const float GLOW_COLOR_STRENGTH = 0.3;   // 颜色光晕浓度,越大彩色光晕越明显
const float DIM_CUTOFF          = 0.35;  // 暗/亮分界阈值(低于接受 glow,高于自身增亮)
const float BRIGHT_CUTOFF       = 0.65;  // 超过此值的邻居贡献更强 glow
glsl
glow-rgbsplit-gentle.glsl  ·  在 GitHub 查看

效果预览

4. 光标拖尾 Shader#

「光标跳跃留下发光拖尾」的效果,就是通过这个 shader 实现的。

为什么选择在 Ghostty Shader 层而非 Neovim 插件实现:Shader 作用于 Ghostty 的最终渲染帧,对所有在其中运行的程序全局生效——Shell、Neovim、btop 同样受益,无需针对每个工具单独配置,效果也更统一。

效果机制:

  • 光标移动时,连接前后位置绘制一个平行四边形拖尾,宽度与光标块一致
  • 亮度与移动距离成比例:单步 h/j/k/l 有微弱拖尾,gg/G// 等大幅跳跃产生明亮完整的拖尾
  • 加法混合:只增加亮度,永不使画面变暗
  • 颜色采用 Catppuccin Macchiato 的 Lavender-Mauve,与整体主题一致

顶部几个可调参数:

const vec3  TRAIL_COLOR  = vec3(0.792, 0.741, 0.973); // 拖尾颜色,注释中有多种 Macchiato 备选色
const float DURATION     = 0.5;   // 拖尾消散时长(秒)
const float BRIGHTNESS   = 0.75;  // 整体亮度(0.0 ~ 1.0)
const float MIN_DISTANCE = 0.003; // 触发拖尾的最小移动距离(过滤光标抖动噪声)
glsl
cursor-catppuccin-trail.glsl  ·  在 GitHub 查看

5. shader.sh:热更新切换工具#

每次切换 shader 都要手动修改 ghostty 的 config 文件中 custom-shader 比较繁琐。
使用 shader.sh 脚本,添加到 $PATH 后可以直接用命令行切换 shader,然后在 Ghostty 中按 Cmd+Shift+, 重载配置,实现秒级热更新

命令功能
shader.sh list列出所有可用 shader,标记当前激活项
shader.sh set <name>切换到指定 shader(支持模糊名称匹配)
shader.sh set无参数时进入 fzf 交互多选
shader.sh add <name>在现有 shader 后追加(组成多级管线)
shader.sh off禁用所有 shader
shader.sh current查看当前激活的 shader 管线
shader.sh  ·  在 GitHub 查看

alt text

macOS 终端配置(二):主题美化
https://astro-pure.js.org/blog/mac-terminal-config-theme
Author 秋与
Published at July 26, 2023
Comment seems to stuck. Try to refresh?✨