菜单

行范围处理

相关源文件

行范围处理是 bat 用于根据用户指定的行号范围过滤和显示输入文件的特定部分。该系统使用户能够仅查看文件中选定的行,支持绝对行号和相对于文件末尾的偏移量。有关显示行的语法高亮信息,请参阅语法高亮系统。有关应用于行号的视觉样式和装饰的详细信息,请参阅样式组件和装饰

核心数据结构

行范围系统围绕几个关键数据结构构建,这些数据结构协同工作以表示、解析和评估行范围。

来源:src/line_range.rs1-390

范围规范格式

行范围解析器支持多种输入格式,以适应不同的用例。每种格式都是为用户希望查看文件部分时的特定场景设计的。

格式示例描述下界上界
单行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 对象,该过程处理各种边缘情况和验证。

来源:src/line_range.rs40-106

范围检查逻辑

范围检查系统确定给定的行号是否落在任何指定范围内,它处理绝对边界和末尾相对边界,并考虑流式输入。

来源:src/line_range.rs108-166

多范围处理

LineRanges 结构管理单个范围的集合,并允许同时高效地检查多个范围。它预先计算优化元数据,以提高逐行处理期间的性能。

来源:src/line_range.rs298-375

与打印机系统集成

行范围处理与 bat 的打印机系统集成,以控制显示哪些行以及如何格式化它们。 RangeCheckResult 枚举指导打印机的决策过程。

来源:src/line_range.rs351-370

高亮显示行范围

HighlightedLineRanges 包装器提供了一个专门用于需要语法高亮显示的范围的接口,这与主显示范围不同。

显示范围和高亮范围之间的区别允许出现这种情况:用户希望查看所有行,但只高亮显示特定部分,反之亦然。

来源:src/line_range.rs383-391

性能优化

行范围系统包括几项性能优化,以高效处理大文件

预计算的边界

LineRanges 结构在构造期间预先计算了几个边界值,以避免在行检查期间重复计算。

  • largest_absolute_upper_bound:在处理超出所有绝对范围的行时,可以提前终止。
  • smallest_offset_from_end:用于确定何时行超出末尾相对范围。
  • largest_offset_from_end:跟踪所需的最大回溯距离。

流式感知设计

该系统区分 MaxBufferedLineNumber::TentativeMaxBufferedLineNumber::Final,以高效处理流式输入。

  • 试探性:在流式处理期间,对范围边界进行保守的假设。
  • 最终:当达到 EOF 时,可以进行精确的范围边界计算。

提前终止

RangeCheckResult::AfterLastRange 结果允许打印机在不再有任何行可能匹配任何剩余范围时停止处理。

来源:src/line_range.rs319-348 src/line_range.rs289-296