yazi 暗色主题:颜色都给了谁,改 2 处调出自己的终端主题
【免费下载链接】yazi💥 Blazing fast terminal file manager written in Rust, based on async I/O.项目地址: https://gitcode.com/GitHub_Trending/ya/yazi
有次夜里在暗色终端里开 yazi 整理文件,我注意到当前选中的标签是一整块蓝底,没选中的是灰底,按下v进选择模式时模式指示器又变成了红底。这个用 Rust 写的终端文件管理器,颜色给得并不随手:它的暗色主题就是预设里一份 theme-dark.toml,界面上每种颜色各管一个位置。这里讲清楚这套颜色来自哪里,以及你在哪改两处,就能把终端主题调成自己的口味。
yazi 暗色主题是什么
| 维度 | 本项目做法 | 为什么 |
|---|---|---|
| 定位 | 单二进制运行的终端文件管理器,基于异步 I/O | 大目录加载快,彩色渲染不吃资源 |
| 主题分发 | theme-dark.toml 与 theme-light.toml 两份预设,启动时按终端是否暗色模式自动挑一份加载 | 换终端、换光线不用手动切主题 |
| 你的定制 | 用户配置目录放一份 theme.toml,写了的段落按项覆盖预设 | 不必整份拷贝预设文件,改哪写哪 |
| 颜色分配 | 颜色只给"状态"和"类型"用:活动蓝底、非活动灰底、文件类型各占一色 | 一眼知道哪个文件、处于什么状态,界面不花 |
预设文件放在 yazi-config/preset/ 目录,主题的实现代码在 yazi-config/src/theme/。
yazi 暗色主题关键实现拆解
文件类型颜色怎么匹配
渲染文件列表时,yazi 对每一行"按顺序过规则"定颜色。预设的 [filetype] 段落里是一张 rules 规则表,每条规则一个匹配条件加一种样式:图片(mime**/image/*)用黄色,音视频({audio,video}/*)用 magenta,zip、rar、7z 这类压缩包用 red,pdf、doc、rtf 文档用 cyan,可执行文件(is = "exec")用 green,最后一条{ url = "*/", fg = "blue" }兜住所有目录。
顺序即优先级,规则命中第一条就停手。这就是为什么预设把具体类型排前面、目录兜底放最后:目录本身也匹配*/,若排在最前,所有文件都会变蓝。你想给某种新类型加色,插到兜底规则之前即可。匹配入口在 yazi-config/src/theme/filetype.rs,骨架长这样:
impl Filetype { // 按顺序过规则,命中第一条即停 pub fn match_style(&self, file: &File, mime: &str) -> Option<StyleFlat> { self.rules.load().iter() .find(|rule| rule.matches(file, mime)) .map(|rule| rule.style) } } // 先过状态检查(可执行/目录/孤儿文件),再按 url 或 mime 模式匹配 fn match_with(&self, file: Option<&File>, mime: Option<&str>) -> bool { match (self.is.enabled(), file) { (Some(is), Some(f)) if !is.check(&f.cha) => false, (Some(_), None) => false, _ => self.selector.match_with(file, mime), } }find()就是"先到先得"的核心,一条规则命中后后面的规则直接不再检查。
暗色/亮色怎么自动加载,状态色怎么反馈
另一个平时感不到、但决定体验的机制:yazi 启动时探测终端处于暗色还是亮色模式,对应加载 theme-dark.toml 或 theme-light.toml,theme-dark.toml 文件开头那行注释写明了这件事;你在用户配置目录写的 theme.toml 则按项覆盖预设。
颜色主要拿来反馈"状态"。标签栏当前 tab 蓝底加粗、其余 tab 灰底,模式指示器平时蓝底、进选择模式转红底;文件列表左边的四个标记列各有专色:复制 lightgreen、剪切 lightred、标记 lightcyan、选中 lightyellow。配色逻辑很克制:亮色底表示"你现在在哪",灰色系表示"别的",红色只留给带警示意味的选择模式。预设里这两段是这样写的:
[tabs] active = { bg = "blue", bold = true } # 正在看的标签:蓝底,醒目 inactive = { fg = "blue", bg = "gray" } # 其余标签:灰底,退后 [mode] normal_main = { bg = "blue", bold = true } # 普通模式 select_main = { bg = "red", bold = true } # 进选择模式切红底读完这两段,"活动亮、非活动灰、警示红"的暗色主题配色就齐了。
动手改一版:自己调暗色主题配置
所有改动都落在用户配置目录的 theme.toml 里,仓库内文件不用碰。
最小改动:一行换掉标签栏颜色
在用户配置目录建一份 theme.toml,只写一行:
# ~/.config/yazi/theme.toml [tabs] active = { bg = "green", bold = true } # 蓝底换成绿底改完你会看到:下次启动,当前标签变成绿底白字加粗,未选中的保持灰底,整个界面从蓝色调转成绿色调,其余标记、边框样式一概不动。
进阶覆盖:用户目录局部覆盖
# ~/.config/yazi/theme.toml [mgr] cwd = { fg = "lightblue", bold = true } # 当前目录名高亮 [status] perm_read = { fg = "lightyellow" } # 读权限 perm_write = { fg = "lightred" } # 写权限 perm_exec = { fg = "lightgreen" } # 执行权限 [filetype] rules = [ { mime = "**/image/*", fg = "lightcyan" }, # 图片改成青色 { url = "*/", fg = "blue" } # 保留目录兜底规则 ]注意 [filetype] 的 rules 是整段替换而不是追加:你写了 rules,预设里那张规则表就整体失效,所以末尾一定要留一条目录兜底。改完你会看到:底部状态栏权限字样变成黄红青三色,图片统一从黄色换成青色,目录保持蓝色,其它没写的段落仍沿用预设。
收尾
这套暗色主题的取舍在于:颜色少给,每色只挂一个"状态"或"类型",界面因此不花,改动一处立刻见效。想看完整源码的话:
git clone https://gitcode.com/GitHub_Trending/ya/yazi现在就在你的配置目录建一份 theme.toml,抄上面第一行,启动 yazi,终端暗色主题就成了你自己的。
【免费下载链接】yazi💥 Blazing fast terminal file manager written in Rust, based on async I/O.项目地址: https://gitcode.com/GitHub_Trending/ya/yazi
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考