菜单

语法检测和映射

相关源文件

本文档介绍了 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

Glob 模式匹配过程

语法检测遵循特定的匹配算法和回退策略

来源: src/syntax_mapping.rs148-168

构建时静态映射生成

内置映射是在编译时从按平台组织的 TOML 配置文件生成的

平台特定组织

目录目标平台目的
common/所有平台通用文件类型映射
unix-family/类 Unix 系统Unix 特定文件
bsd-family/BSD 变体BSD 特定约定
linux/仅限 LinuxLinux 特定文件
macos/仅限 macOSmacOS 特定文件
windows/仅限 WindowsWindows 特定文件

构建流程

来源: 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