bat 的资产管理与构建管道负责打包、构建和加载对 bat 核心功能至关重要的语法高亮定义和主题。该系统管理超过 150 个外部存储库作为 Git 子模块,将它们编译成优化的二进制资产,并通过延迟评估技术实现高效的运行时加载。
有关如何将语法高亮应用于内容的详细信息,请参阅 语法高亮。
bat 的资产管理系统解决了几个关键需求:
该系统使用 Git 子模块来跟踪外部语法和主题存储库,通过构建过程将它们编译成二进制资产,并使用运行时加载机制,优先加载可用的自定义资产。
来源:.gitmodules1-275 src/assets/build_assets.rs12-36
bat 将其语法定义和主题作为 Git 子模块进行管理,这允许跟踪外部存储库的特定版本。
存储库包括:
.gitmodules 文件定义了 100 多个子模块,组织结构如下:
assets/syntaxes/01_Packages - 来自 Sublime Text 的核心语法定义assets/syntaxes/02_Extra/[Language] - 额外的语言支持assets/themes/[Theme] - 各种主题存储库除了内置资产外,bat 还支持用户在自定义目录中定义资产,通常位于 ~/.config/bat/syntaxes/ 和 ~/.config/bat/themes/。这些自定义资产会覆盖同名的内置资产。
来源:src/assets/build_assets.rs38-63 src/assets/build_assets.rs65-89
资产构建过程将原始的语法和主题文件转换为优化的二进制格式,以便在运行时高效加载。
初始化阶段:
create.sh 脚本确保所有子模块都已初始化。bat cache --build 来编译资产主题处理:
build_theme_set() 从主题目录加载主题定义LazyThemeSet 以实现高效加载语法处理:
build_syntax_set_builder() 从语法定义创建语法集致谢生成:
资产序列化:
构建过程会生成三个主要的二进制文件:
syntaxes.bin:包含序列化的语法定义themes.bin:包含序列化的主题acknowledgements.bin:包含许可信息它还会创建一个元数据文件来跟踪已构建资产的版本。
来源:assets/create.sh1-70 src/assets/build_assets.rs12-139 src/assets/build_assets/acknowledgements.rs18-45
在运行时,bat 采用复杂的资产加载系统,在性能和内存使用之间取得平衡。
bat 使用优先排序的方法来确定加载哪些资产:
为了优化内存使用和启动时间,bat 使用两种不同的加载方法:
LazyThemeSet:主题在被请求时按需加载
OnceCell 确保主题最多只反序列化一次SerializedSyntaxSet:语法定义作为完整集进行加载
这种方法意味着不常用的主题在被请求之前不会占用内存,而语法定义(通常是必需的)则作为完整集加载以获得最佳性能。
来源:src/assets/lazy_theme_set.rs1-104 src/assets/serialized_syntax_set.rs1-28
bat 提供了一个机制,允许用户通过 bat cache 命令添加自己的语法定义和主题。
用户可以通过以下方式添加自定义资产:
创建相应的目录
~/.config/bat/syntaxes/ 用于语法定义~/.config/bat/themes/ 用于主题添加相应的文件
.sublime-syntax 文件用于语法定义.tmTheme 文件用于主题运行 bat cache --build 来编译资产
自定义资产会覆盖同名的内置资产,允许用户覆盖或扩展默认行为。
bat cache 命令提供了多种操作:
--build:从所有可用来源构建缓存--clear:移除任何现有的缓存--source:指定自定义资产来源目录--target:指定缓存的自定义目标目录--blank:从空白缓存开始,忽略内置定义这种灵活的方法允许用户完全自定义 bat 中的高亮体验。
来源:assets/create.sh42-69 src/assets/build_assets.rs101-139 tests/assets.rs1-42 examples/advanced.rs1-18 examples/list_syntaxes_and_themes.rs1-19
资产管理系统包含测试,以确保所有预期的主题都存在,并且序列化/反序列化过程能够正常工作。
这些测试有助于在添加新资产或更新现有资产时维护兼容性。