本文档介绍了 bat 的语法检测和映射系统,该系统根据文件的路径、文件名和扩展名来确定要应用于给定文件的语法高亮规则。该系统使用 glob 模式匹配将文件模式与语法定义或回退检测策略关联起来。
有关语法资源如何构建和管理的详细信息,请参阅 资产管理和构建管道。有关实际语法定义和语言支持的详细信息,请参阅 语法定义和语言支持。
语法检测系统通过 SyntaxMapping 结构体运行,该结构体维护用户自定义映射和平台特定内置映射。当 bat 需要确定文件的合适语法时,它会使用 glob 模式匹配文件路径和文件名来找到最佳匹配项。
来源: src/syntax_mapping.rs148-168
该系统定义了三种映射目标,用于指定如何处理匹配的文件
| 目标类型 | 目的 | 用途 |
|---|---|---|
MapTo(&str) | 直接映射到特定语法 | 具有已知扩展名的文件,例如 *.rs → "Rust" |
MapToUnknown | 推迟到基于内容的检测 | 无扩展名的文件,例如 Makefile → 检查 shebang |
MapExtensionToUnknown | 基于扩展名的回退 | 通用扩展名,例如 *.conf → 先尝试文件名,然后尝试内容 |
来源: src/syntax_mapping.rs29-47 build/syntax_mapping.rs17-45
SyntaxMapping 结构体维护两种具有不同优先级的映射:
用户通过 `insert()` 方法在运行时添加的映射。这些映射具有最高优先级,并会覆盖任何内置规则。
来源: src/syntax_mapping.rs99-103 src/syntax_mapping.rs112-124
平台特定映射,在构建时从 TOML 配置文件生成。为提高性能,这些映射是惰性编译的。
来源: build/syntax_mapping.rs267-284 src/syntax_mapping/builtin.rs51-82
语法检测遵循特定的匹配算法和回退策略
来源: src/syntax_mapping.rs148-168
内置映射是在编译时从按平台组织的 TOML 配置文件生成的
| 目录 | 目标平台 | 目的 |
|---|---|---|
common/ | 所有平台 | 通用文件类型映射 |
unix-family/ | 类 Unix 系统 | Unix 特定文件 |
bsd-family/ | BSD 变体 | BSD 特定约定 |
linux/ | 仅限 Linux | Linux 特定文件 |
macos/ | 仅限 macOS | macOS 特定文件 |
windows/ | 仅限 Windows | Windows 特定文件 |
来源: build/syntax_mapping.rs216-264 build/syntax_mapping.rs287-300
构建系统支持在 glob 模式中进行环境变量替换,以实现灵活匹配
来源: build/syntax_mapping.rs66-117 src/syntax_mapping/builtin.rs67-82
忽略后缀功能允许 bat 识别文件,即使它们有额外的后缀,如 .bak、.orig 或 .tmp
来源: src/syntax_mapping.rs161-168 src/syntax_mapping.rs170-172
该系统包含多项性能优化,以提高启动和运行效率
内置的 glob 匹配器使用 Lazy<Option<GlobMatcher>> 来推迟编译,直到首次使用
该系统可以将匹配器编译卸载到后台线程,以加快启动速度
来源: src/syntax_mapping.rs76-97 src/syntax_mapping/builtin.rs51-58