语法高亮系统是核心组件,负责将纯文本文件转换为带颜色的、语法感知的输出。该系统确定要用于高亮的编程语言或文件格式,加载相应的语法定义,并通过 syntect 库应用它们,以生成最终的高亮文本。
该系统通过从 Sublime Text 包和社区资源导入的语法定义,支持超过 200 种编程语言和文件格式。本页面提供了所有组件如何协同工作以实现语法高亮的全面概述。
有关具体的实现细节,请参阅
有关视觉样式和主题的信息,请参阅 主题系统和视觉样式。
语法高亮系统由四个主要组件组成,它们协同工作,将纯文本转换为语法高亮输出。
来源:.gitmodules1-278 src/syntax_mapping.rs1-174 assets/syntaxes.bin assets/themes.bin
| 组件 | 主要功能 | 关键文件 |
|---|---|---|
| 资产管理 | 收集、构建和分发语法定义 | .gitmodules build/syntax_mapping.rs |
| 语法映射 | 将文件模式映射到语法定义 | src/syntax_mapping.rs src/syntax_mapping/builtin.rs |
| Syntect 引擎 | 核心高亮逻辑和主题应用 | 外部 syntect crate |
| 二进制资产 | 已编译的语法和主题数据的运行时存储 | assets/syntaxes.bin assets/themes.bin |
来源:src/syntax_mapping.rs1-174 build/syntax_mapping.rs1-301 src/syntax_mapping/builtin.rs
高亮过程遵循从文件输入到语法高亮输出的清晰流水线
来源:src/syntax_mapping.rs148-168
系统在处理过程中会做出几个关键决策
来源:src/syntax_mapping.rs29-47 build/syntax_mapping.rs18-26
SyntaxMapping 结构体负责确定为给定文件使用哪个语法定义。它维护内置和用户定义的映射,并按优先级顺序排列。
来源:src/syntax_mapping.rs49-173
HighlightingAssets 结构体负责管理运行时对语法定义和主题的访问,从嵌入的二进制资源或用户提供的缓存目录加载它们。
该系统集成了 syntect 库来进行实际的高亮工作。 syntect 提供了
.sublime-syntax 文件来源:assets/syntaxes.bin assets/themes.bin
静态语法映射在构建时从 TOML 配置文件生成,创建高效的运行时查找表。
来源:build/syntax_mapping.rs289-301 src/syntax_mapping/builtin.rs10-13
语法检测逻辑决定对文件应用哪种语法高亮。它遵循一个多步骤过程:
MapToUnknown 或 MapExtensionToUnknown 的文件,请分析文件内容来源:src/syntax_mapping.rs148-168
匹配过程使用 globset crate 将文件模式与 glob 模式进行匹配。这使得可以灵活地定义可以匹配特定文件名、扩展名甚至路径模式的模式。
bat 的语法映射系统中的 glob 模式默认情况下不区分大小写,并按字面意义处理路径分隔符。这意味着:
*.rs 将匹配所有具有 .rs 扩展名的文件,无论大小写/path/to/*.md 将仅匹配 /path/to/ 目录中的 Markdown 文件用户可以通过以下几种方式自定义语法高亮
可以使用 SyntaxMapping 结构体的 insert 方法以编程方式添加自定义映射。
来源: src/syntax_mapping.rs99-103 src/syntax_mapping.rs217-249
自定义映射会覆盖内置映射,允许用户覆盖默认行为。例如,用户可以将所有 .log 文件映射到特定的语法高亮。
该系统还支持忽略某些文件后缀以进行语法检测。例如,对于 .min.js 文件,可以忽略 .min 后缀,从而应用与常规 .js 文件相同的语法高亮。
来源: src/syntax_mapping.rs170-172 src/syntax_mapping.rs163-167
语法高亮系统与 bat 的输出系统集成,以生成最终的高亮输出。
来源: src/output.rs22-26 src/output.rs146-155
高亮后的内容可以被定向到分页器(如 less)或直接输出到标准输出。在使用分页器时,bat 会通过向分页器传递适当的参数来确保正确的 ANSI 颜色解释。
bat 中的语法高亮系统提供了一个强大的框架,用于确定和应用各种文件类型的语法高亮。它利用 Sublime Text 语法定义、灵活的映射系统和高效的二进制资产,提供快速准确的语法高亮。
该系统设计为可通过自定义映射和附加语法定义进行扩展,从而允许用户根据特定需求调整 bat。