eza 颜色与主题定制完全指南:EZA_COLORS 环境变量与 theme.yml 详解
eza 颜色与主题定制完全指南EZA_COLORS 环境变量与 theme.yml 详解【免费下载链接】ezaA modern alternative to ls项目地址: https://gitcode.com/gh_mirrors/ez/ezaeza现代版ls在终端输出中对文件名、权限位、大小、日期、Git 状态等几乎每个元素都提供了细粒度的配色能力。本文以官方 man 手册 man/eza_colors-explanation.5.md 为骨架结合仓库源码src/theme/、src/options/config.rs、src/info/filetype.rs深入讲解两层定制体系通过EZA_COLORS/LS_COLORS环境变量快速覆盖颜色以及通过theme.yml配置文件声明式定义完整主题。读完本文你将掌握颜色代码的语法、内置扩展映射的覆盖机制以及如何写出可复现、可分享的个性化主题文件。一、定制颜色的两种入口eza 的配色定制分为两个层次环境变量层EZA_COLORS/LS_COLORS/ 旧名EXA_COLORS适合临时覆盖、单点微调例如“把 zip 文件变绿”“把日期列变绿”配置文件层theme.yml适合系统性的主题声明通过EZA_CONFIG_DIR或$XDG_CONFIG_HOME/eza/theme.yml加载支持图标、前景/背景色、加粗、斜体等完整样式属性。两者可以叠加使用配置文件ThemeConfig解析得到基础UiStyles后环境变量中的映射会继续覆盖其上。这一点在 src/theme/mod.rs 的to_theme()中体现先加载theme_config得到 UI 样式再调用parse_color_vars解析环境变量对样式进行二次修改最后把 glob 映射与内置FileTypes组合成FileStyle链。二、环境变量语法键值对、分隔符与 globEZA_COLORS的语法结构详见 man/eza_colors.5.md键值对之间用连接例如*.txt32同一键的多个 ANSI 格式码用;连接例如*.txt32;1;4绿色加粗加下划线多组键值对之间用:分隔例如*.txt32:*.mp31;35。键可以是两位字母代码如da表示日期、uu表示当前用户也可以是文件 glob如*.zip、Vagrantfile。任何不是合法两位代码的键都会被当作 glob 处理——即使它恰好也是两位字母。从源码 src/theme/lsc.rs 可以看到LSColors::each_pair按:切分、再按切分最多取三段只有“键和值都非空”的项才被接受随后 src/theme/mod.rs 的parse_color_vars先尝试用set_ls/set_exa匹配两位代码匹配失败才交给glob::Pattern作为文件映射。需要注意的是EXA_COLORS向后兼容当EZA_COLORS未设置时eza 会回退检查EXA_COLORSman/eza_colors.5.mdEXA_COLORS覆盖LS_COLORSEZA_COLORS中给出的值会覆盖LS_COLORS中的同名项因此无需重写整套LS_COLORS就能扩展它样式值必须合法与某些ls实现不同eza 会严格校验 ANSI 码不会原样输出任意字符。lsc.rs的to_style()只识别1(bold)、2(dimmed)、3(italic)、4(underline)、5(blink)、7(reverse)、8(hidden)、9(strikethrough)、标准 16 色30–37、90–97、256 色38;5;nnn、真彩 RGB38;2;r;g;b以及对应的背景色40–47、100–107、48;5;nnn、48;2;r;g;b其余一律忽略。三、经典用法示例以下示例均来自官方 man 文档可直接复制使用目标命令关闭“当前用户”高亮EZA_COLORSuu0:gu0日期列变绿EZA_COLORSda32高亮 VagrantfileEZA_COLORSVagrantfile1;4;33覆盖 zip 默认颜色256 色EZA_COLORS*.zip38;5;125Markdown 偏绿、日志偏灰EZA_COLORS*.md38;5;121:*.log38;5;248覆盖与重置内置扩展映射eza 内置了一套覆盖常见扩展名的颜色映射文档、压缩包、媒体、临时文件等。环境变量中的任何映射都会覆盖内置默认值例如LS_COLORS*.zip32只会把 zip 文件变绿其他压缩文件的颜色保持不变。若想彻底禁用内置映射可在EZA_COLORS开头放一个reset条目EZA_COLORSreset:*.txt31只高亮文本文件EZA_COLORSreset什么都不高亮。源码实现上parse_color_vars检测到exa值为reset或以reset:开头时会将use_default_filetypes置为falsesrc/theme/mod.rs随后to_theme()依据“自定义映射是否为空 是否使用内置映射”两个布尔量组合出四种FileStyle仅内置、仅自定义、两者叠加自定义优先、全部关闭src/theme/mod.rs。glob 映射的匹配顺序自定义 glob 从后往前匹配即后定义的条目优先级更高src/theme/mod.rs。同时简单的*.ext形式会进入哈希表以提升复杂LS_COLORS场景下的匹配性能复杂模式含? * [ ] .等则走 glob 匹配二者行为保持一致。这一点也被 src/theme/mod.rs 的单元测试覆盖例如pi31:pi32:pi33最终生效的是黄色33。四、内置扩展类型与默认配色eza 将常见文件归为若干语义类型每种类型有独立的默认样式。官方说明如下对应 src/info/filetype.rs 与 src/theme/default_theme.rs 的实现类型示例扩展/文件名默认样式Build构建文件Makefile、Cargo.toml、package.json黄色加粗加下划线Image图片png、jpeg、gif紫色Video视频mp4、ogv、m2ts更深的紫色加粗Music有损音乐mp3、m4a、ogg淡蓝色Lossless无损音乐flac、alac、wav稍亮的蓝色加粗Crypto加密相关asc、enc、p12亮绿色加粗Document文档pdf、doc、dvi更淡的绿色Compressed压缩文件zip、tgz、Z红色Temp临时文件tmp、swp、~默认前景色变暗dimmedCompiled编译产物class、o、pyc黄色Source源码cpp、js、java亮黄色加粗Compiled 的智能判定除了“常见扩展名”外eza 还会把一个文件判为编译产物——如果它使用常见扩展名、且与其某个源文件位于同一目录。例如styles.css旁边存在styles.less/styles.sass时或scripts.js旁边存在scripts.ts/scripts.coffee时。对应逻辑见 src/info/filetype.rs文件以~结尾或#...#包裹判为 Temp再依次查文件名表、扩展名表最后检查是否与源文件同目录。值得一提的是eza 支持亮色系bright colours在EZA_COLORS中可直接使用90–97的亮色代码90深灰、91亮红、92亮绿、93亮黄、94亮蓝、95亮紫、96亮青、97亮白大多数现代 256 色终端都支持。五、两位代码速查表LS_COLORS 兼容的十个代码di目录、ex可执行文件、fi普通文件、pi命名管道、so套接字、bd块设备、cd字符设备、ln符号链接、or无目标的符号链接。这些由set_ls处理src/theme/ui_styles.rs。EZA_COLORS 扩展代码权限位oc(八进制权限)、ur/uw/ux/ue、gr/gw/gx、tr/tw/tx、su/sf、xa(扩展属性指示符)。大小sn一次设置nb nk nm ng nt五个数字样式、sb一次设置ub uk um ug ut五个单位样式、nb/nk/nm/ng/nt按 B/KB/MB/GB/TB 分级的数字颜色、ub/uk/um/ug/ut对应的单位颜色、df/ds设备主/次 ID。用户与组uu(你自己)、uR(root)、un(其他人)、gu(你所在的组)、gR(与 root 相关的组)、gn(你不在的组)。链接lc(硬链接数)、lm(至少两个硬链接的普通文件的链接数)。Gitga(新增)、gm(修改)、gd(删除)、gv(重命名)、gt(元数据变更)、gi(忽略)、gc(冲突)。Git 仓库状态Gm(主分支)、Go(其他分支)、Gc(干净)、Gd(脏)。UI 元素xx(标点/背景 UI)、da(日期)、in(inode)、bl(块数)、hd(表头)、lp(符号链接路径)、cc(文件名中的转义字符)、bO(损坏符号链接路径的覆盖样式)、sp(特殊文件)、mp(挂载点)、oc(八进制)。文件类型im(图片)、vi(视频)、mu(有损音乐)、lo(无损音乐)、cr(加密)、do(文档)、co(压缩)、tm(临时)、cm(编译产物)、bu(构建文件)、sc(源码)、ic(图标未设置时与文件名同色)。SELinux 安全上下文Sn(无上下文)、Su(SELinux user)、Sr(role)、St(type)、Sl(level)。BSD 文件标志ff。以上完整对应关系可在 src/theme/ui_styles.rs 的set_exa中逐一查到并且每一条都有对应单元测试验证src/theme/mod.rs例如exa_uu: ls , exa uu38;5;117断言user_you被设置为Fixed(117)。六、theme.yml声明式主题配置文件从 man/eza_colors-explanation.5.md 可知eza 支持通过theme.yml文件一次性声明上述所有样式及更多属性。配置文件查找路径设置EZA_CONFIG_DIR指定 eza 查找theme.yml的目录否则查找$XDG_CONFIG_HOME/eza/theme.yml文件名必须为theme.yml无论你指定哪个目录。源码层面默认路径由dirs::config_dir()拼接eza/theme.yml生成src/options/config.rs加载解析在ThemeConfig::to_theme()中完成打开文件并用serde_norwayYAML反序列化为UiStylesOverride再与默认UiStyles做“覆盖式”合并——未声明的字段保留默认值声明的字段替换默认值src/options/config.rs、src/options/config.rs。可用字段总览filekinds: normal directory symlink pipe block_device char_device socket special executable mount_point perms: user_read user_write user_execute_file user_execute_other group_read group_write group_execute other_read other_write other_execute special_user_file special_other attribute size: major minor number_byte number_kilo number_mega number_giga number_huge unit_byte unit_kilo unit_mega unit_giga unit_huge users: user_you user_root user_other group_yours group_other group_root links: normal multi_link_file git: new modified deleted renamed ignored conflicted git_repo: branch_main branch_other git_clean git_dirty security_context: none: selinux: colon user role typ range file_type: image video music crypto document compressed temp compiled build source punctuation: date: inode: blocks: header: octal: flags: control_char: broken_symlink: broken_path_overlay:每个字段可用的样式属性每个字段/子字段下都可以定义以下样式属性foreground: Blue background: null is_bold: false is_dimmed: false is_italic: false is_underline: false is_blink: false is_reverse: false is_hidden: false is_strikethrough: true prefix_with_reset: false颜色取值除Blue、Red、Green等命名色外还支持#rrggbb十六进制如#ff00ff、#rgb缩写、0–255 的 256 色编号如125、以及default/none。解析函数color_from_strsrc/options/config.rs对十六进制支持#ff00ff与#f0f两种形式数字字符串直接映射为Fixed(n)并有对应的单元测试src/options/config.rs。布尔属性别名fg/bg可分别作为foreground/background的别名bold/dimmed/italic/underline/blink/reverse/hidden/strikethrough/prefix_reset分别是各is_*字段的别名src/options/config.rs。完整示例file_type: image: foreground: Blue is_italic: true date: foreground: White security_context: selinux: role: is_hidden: true自定义图标filenames和extensions字段还可以定制图标icon glyph及其颜色filenames: # 只改图标字形 Cargo.toml: {icon: {glyph: }} Cargo.lock: {icon: {glyph: }} extensions: rs: { filename: {foreground: Red}, icon: {glyph: }}仓库自带的示例配置 docs/theme.yml 展示了更完整的用法不仅改了Cargo.toml/Cargo.lock的图标为 还把rs扩展名的文件名改为红色并配 图标同时为nix扩展名配置了 ❄ 图标和白色样式。实现层面图标与文件名样式由FileNameStyle { icon: OptionIconStyle, filename: OptionStyle }描述src/theme/ui_styles.rsIconStyle包含glyph: Optionchar与style: OptionStyle在style_override中按“文件名精确匹配 → 扩展名匹配”的顺序查找覆盖src/theme/mod.rs。使用 theme.yml 的注意事项并非所有字形都支持改颜色某些 Unicode 图标无法着色此时颜色属性不生效语法错误影响面大如果主题没有生效请先仔细检查 YAML 语法——一个语法问题可能导致多个属性同时失效文件名必须固定为theme.yml与所选目录无关。七、颜色输出的启用条件最后需要说明颜色在什么情况下会真正输出。UseColours有三种模式src/theme/mod.rsAlways即使输出不指向终端也显示颜色Automatic默认仅当 stdout 是终端时显示输出到管道时关闭避免干扰grep、more等程序Never即使输出到终端也不显示。to_theme()会在Never或Automatic且非 TTY 时退化为纯色输出UiStyles::plain()NoFileStyleWindows 旧版控制台无法启用 ANSI 时也会自动降级src/theme/mod.rs。因此在管道、脚本或 CI 环境中颜色定制不会污染文本输出。八、进一步阅读man/eza_colors.5.mdEZA_COLORS两位代码、ANSI 样式码的完整权威清单src/theme/default_theme.rs内置默认主题的完整颜色定义src/theme/ui_styles.rsUiStyles数据结构与set_ls/set_exa全部代码映射src/theme/lsc.rsLS_COLORS 字符串解析与 ANSI 码→样式转换src/options/config.rstheme.yml反序列化与覆盖合并逻辑src/info/filetype.rsBuild/Source/Compiled/Temp 等文件类型判定表docs/theme.yml官方示例主题文件。【免费下载链接】ezaA modern alternative to ls项目地址: https://gitcode.com/gh_mirrors/ez/eza创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考