From 07487834044a1e24247d4c1631447419fdd463d2 Mon Sep 17 00:00:00 2001 From: Bojan Durdevic Date: Sat, 21 Aug 2021 13:55:52 -0400 Subject: [PATCH] Support for line range plus syntax --- CHANGELOG.md | 1 + assets/manual/bat.1.in | 4 ++++ src/bin/bat/clap_app.rs | 6 ++++-- src/line_range.rs | 28 +++++++++++++++++++++++++++- 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d956725..ec4d9e08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Features - `$BAT_CONFIG_DIR` is now a recognized environment variable. It has precedence over `$XDG_CONFIG_HOME`, see #1727 (@billrisher) +- Support for `x:+x` syntax in line ranges (e.g. `20:+10`). See #1810 (@bojan88) ## Bugfixes diff --git a/assets/manual/bat.1.in b/assets/manual/bat.1.in index c16b9d42..b91f7dc8 100644 --- a/assets/manual/bat.1.in +++ b/assets/manual/bat.1.in @@ -50,6 +50,8 @@ highlights lines 30 to 40 highlights lines 1 to 40 .IP "\-\-highlight\-line 40:" highlights lines 40 to the end of the file +.IP "\-\-highlight\-line 30:+10" +highlights lines 30 to 40 .RE .HP \fB\-\-file\-name\fR ... @@ -154,6 +156,8 @@ prints lines 30 to 40 prints lines 1 to 40 .IP "\-\-line\-range 40:" prints lines 40 to the end of the file +.IP "\-\-line\-range 30:+10" +prints lines 30 to 40 .RE .HP \fB\-L\fR, \fB\-\-list\-languages\fR diff --git a/src/bin/bat/clap_app.rs b/src/bin/bat/clap_app.rs index 2ac0eba5..5e25b01a 100644 --- a/src/bin/bat/clap_app.rs +++ b/src/bin/bat/clap_app.rs @@ -95,7 +95,8 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> { '--highlight-line 40' highlights line 40\n \ '--highlight-line 30:40' highlights lines 30 to 40\n \ '--highlight-line :40' highlights lines 1 to 40\n \ - '--highlight-line 40:' highlights lines 40 to the end of the file", + '--highlight-line 40:' highlights lines 40 to the end of the file\n \ + '--highlight-line 30:+10' highlights lines 30 to 40", ), ) .arg( @@ -423,7 +424,8 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> { '--line-range 30:40' prints lines 30 to 40\n \ '--line-range :40' prints lines 1 to 40\n \ '--line-range 40:' prints lines 40 to the end of the file\n \ - '--line-range 40' only prints line 40", + '--line-range 40' only prints line 40\n \ + '--line-range 30:+10' prints lines 30 to 40", ), ) .arg( diff --git a/src/line_range.rs b/src/line_range.rs index 66046500..d014d688 100644 --- a/src/line_range.rs +++ b/src/line_range.rs @@ -47,7 +47,16 @@ impl LineRange { } 2 => { new_range.lower = line_numbers[0].parse()?; - new_range.upper = line_numbers[1].parse()?; + + new_range.upper = if line_numbers[1].bytes().next().unwrap() == b'+' { + let more_lines = &line_numbers[1][1..] + .parse() + .map_err(|_| "Invalid line number after +")?; + new_range.lower + more_lines + } else { + line_numbers[1].parse()? + }; + Ok(new_range) } _ => Err( @@ -100,6 +109,23 @@ fn test_parse_fail() { assert!(range.is_err()); } +#[test] +fn test_parse_plus() { + let range = LineRange::from("40:+10").expect("Shouldn't fail on test!"); + assert_eq!(40, range.lower); + assert_eq!(50, range.upper); +} + +#[test] +fn test_parse_plus_fail() { + let range = LineRange::from("40:+z"); + assert!(range.is_err()); + let range = LineRange::from("40:+-10"); + assert!(range.is_err()); + let range = LineRange::from("40:+"); + assert!(range.is_err()); +} + #[derive(Copy, Clone, Debug, PartialEq)] pub enum RangeCheckResult { // Within one of the given ranges