行范围处理是 bat 用于根据用户指定的行号范围过滤和显示输入文件的特定部分。该系统使用户能够仅查看文件中选定的行,支持绝对行号和相对于文件末尾的偏移量。有关显示行的语法高亮信息,请参阅语法高亮系统。有关应用于行号的视觉样式和装饰的详细信息,请参阅样式组件和装饰。
行范围系统围绕几个关键数据结构构建,这些数据结构协同工作以表示、解析和评估行范围。
行范围解析器支持多种输入格式,以适应不同的用例。每种格式都是为用户希望查看文件部分时的特定场景设计的。
| 格式 | 示例 | 描述 | 下界 | 上界 |
|---|---|---|---|---|
| 单行 | 40 | 仅显示第 40 行 | 绝对(40) | 绝对(40) |
| 完整范围 | 40:50 | 显示第 40 行到第 50 行 | 绝对(40) | 绝对(50) |
| 从开头 | :50 | 从开头显示到第 50 行 | 绝对(usize::MIN) | 绝对(50) |
| 到结尾 | 40: | 从第 40 行显示到结尾 | 绝对(40) | 绝对(usize::MAX) |
| 相对加法 | 40:+10 | 从第 40 行开始显示 10 行 | 绝对(40) | 绝对(50) |
| 相对减法 | 40:-10 | 显示从第 40 行之前的 10 行到第 40 行 | 绝对(30) | 绝对(40) |
| 末尾相对上界 | :-3 | 从开头显示到倒数第 3 行 | 绝对(usize::MIN) | OffsetFromEnd(3) |
| 末尾相对下界 | -3: | 显示最后 3 行 | OffsetFromEnd(3) | 绝对(usize::MAX) |
来源:src/line_range.rs40-106 src/line_range.rs169-275
解析系统通过一个多阶段过程将字符串规范转换为结构化的 LineRange 对象,该过程处理各种边缘情况和验证。
范围检查系统确定给定的行号是否落在任何指定范围内,它处理绝对边界和末尾相对边界,并考虑流式输入。
LineRanges 结构管理单个范围的集合,并允许同时高效地检查多个范围。它预先计算优化元数据,以提高逐行处理期间的性能。
行范围处理与 bat 的打印机系统集成,以控制显示哪些行以及如何格式化它们。 RangeCheckResult 枚举指导打印机的决策过程。
HighlightedLineRanges 包装器提供了一个专门用于需要语法高亮显示的范围的接口,这与主显示范围不同。
显示范围和高亮范围之间的区别允许出现这种情况:用户希望查看所有行,但只高亮显示特定部分,反之亦然。
行范围系统包括几项性能优化,以高效处理大文件
LineRanges 结构在构造期间预先计算了几个边界值,以避免在行检查期间重复计算。
largest_absolute_upper_bound:在处理超出所有绝对范围的行时,可以提前终止。smallest_offset_from_end:用于确定何时行超出末尾相对范围。largest_offset_from_end:跟踪所需的最大回溯距离。该系统区分 MaxBufferedLineNumber::Tentative 和 MaxBufferedLineNumber::Final,以高效处理流式输入。
RangeCheckResult::AfterLastRange 结果允许打印机在不再有任何行可能匹配任何剩余范围时停止处理。