From dc2eae08a6fa5466376694dc278e3ccdc7f91269 Mon Sep 17 00:00:00 2001
From: John Cavanaugh <59479+cavanaug@users.noreply.github.com>
Date: Tue, 15 Jul 2025 16:25:28 -0700
Subject: [PATCH] =?UTF-8?q?docs:=20=F0=9F=93=9A=20update=20changelog=20for?=
=?UTF-8?q?=20range=20context=20support?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
docs(CHANGELOG.md): 📚 add entry for context in line ranges and normalize list formatting
style(src/line_range.rs): 🎨 trim trailing whitespace in context parsing code
---
CHANGELOG.md | 88 +++++++++++++++++++++--------------------------
src/line_range.rs | 8 ++---
2 files changed, 43 insertions(+), 53 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 29ddf751..19aa2f6a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,7 @@
- Add paging to `--list-themes`, see PR #3239 (@einfachIrgendwer0815)
- Support negative relative line ranges, e.g. `bat -r :-10` / `bat -r='-10:'`, see #3068 (@ajesipow)
+- Support context in line ranges, e.g. `bat -r 30::5` / `bat -r 30:40:5`, see #3344 (@cavanaug)
## Bugfixes
@@ -189,7 +190,6 @@
- Add optional output_buffer arg to `Controller::run()` and `Controller::run_with_error_handler()`, see #2618 (@Piturnah)
-
# v0.23.0
## Features
@@ -227,7 +227,6 @@
- `PrettyPrinter::header` correctly displays a header with the filename, see #2378 and #2406 (@cstyles)
-
# v0.22.1
## Bugfixes
@@ -269,7 +268,6 @@
- Make `bat::PrettyPrinter::syntaxes()` iterate over new `bat::Syntax` struct instead of `&syntect::parsing::SyntaxReference`. See #2222 (@Enselic)
- Clear highlights after printing, see #1919 and #1920 (@rhysd)
-
# v0.21.0
## Features
@@ -310,7 +308,6 @@
- Change `Error::SyntectError(syntect::LoadingError)` to `Error::SyntectError(syntect::Error)`. See #2181 (@Enselic)
- Add `Error::SyntectLoadingError(syntect::LoadingError)` enum variant. See #2181 (@Enselic)
-
# v0.20.0
## Features
@@ -336,7 +333,6 @@
- Exposed `get_syntax_set` and `get_theme` methods on `HighlightingAssets`. See #2030 (@dandavison)
- Added `HeaderFilename` and `HeaderFilesize` to `StyleComponent` enum, and mark it `#[non_exhaustive]`. See #1988 (@mdibaiee)
-
# v0.19.0
## Performance
@@ -391,14 +387,12 @@
- Replace the `error::Error(error::ErrorKind, _)` struct and enum with an `error::Error` enum. `Error(ErrorKind::UnknownSyntax, _)` becomes `Error::UnknownSyntax`, etc. Also remove the `error::ResultExt` trait. These changes stem from replacing `error-chain` with `thiserror`. See #1820 (@Enselic)
- Add new `MappingTarget` enum variant `MapExtensionToUnknown`. Refer to its documentation for more information. Also mark `MappingTarget` as `#[non_exhaustive]` since more enum variants might be added in the future. See #1703 (@cbolgiano), #2012 (@Enselic)
-
# v0.18.3
## Bugfixes
- Bump `git2` dependency to fix build with Rust 1.54, see #1761
-
# v0.18.2
## Features
@@ -422,7 +416,6 @@
- Added support for `XAML` syntax, see #1590 and #1655 (@mohamed-abdelnour)
- Apply `DotENV` syntax also for `.env.default` and `.env.defaults` files, see #1669
-
# v0.18.1
## Bugfixes
@@ -446,8 +439,6 @@
- Dark+ VS Code theme, see #1588 and #1598 (@PatriotRossii)
-
-
# v0.18.0
## Features
@@ -490,11 +481,10 @@
## `bat` as a library
- The following `PrettyPrinter` methods have been removed (they were previously deprecated):
- - `input_stdin_with_name`
- - `input_from_bytes_with_name`
- - `input_from_reader_with_name`
- - `vcs_modification_markers` (if the `git` feature is not enabled)
-
+ - `input_stdin_with_name`
+ - `input_from_bytes_with_name`
+ - `input_from_reader_with_name`
+ - `vcs_modification_markers` (if the `git` feature is not enabled)
# v0.17.1
@@ -502,7 +492,6 @@
- Running `bat` without arguments fails ("output file is also an input"), see #1396
-
# v0.17.0
## Features
@@ -531,7 +520,6 @@
- Coldark, see #1329 (@armandphilippot)
-
# v0.16.0
## Features
@@ -696,10 +684,12 @@
This introduces a `features = ["application"]` which is enabled by default and pulls in
everything required by `bat` the application. When depending on bat as a library, downstream
`Cargo.toml` should disable this feature to cut out inapplicable heavy dependencies:
+
``` toml
[dependencies]
bat = { version = "0.14", default-features = false }
```
+
Other optional functionality has also been put behind features: `paging` and `git` support.
- Allow using the library with older syntect, see #896 and #898 (@dtolnay)
@@ -708,7 +698,6 @@
- Rego, see #872 (@patrick-east)
- Stylo, see #917
-
# v0.13.0
## `bat` as a library
@@ -725,7 +714,7 @@ I want to stress that this is the very first release of the library. Things are
That being said, you can start using it! See the example programs in [`examples/`](https://github.com/sharkdp/bat/tree/master/examples).
-You can see the API documentation here: https://docs.rs/bat/
+You can see the API documentation here:
## Features
@@ -734,6 +723,7 @@ You can see the API documentation here: https://docs.rs/bat/
present.
The option now works like this:
+
```bash
--map-syntax :
```
@@ -741,8 +731,8 @@ You can see the API documentation here: https://docs.rs/bat/
For more information, see the `--help` text, the man page or the README.
This new feature allows us to properly highlight files like:
- * `/etc/profile`
- * `~/.ssh/config`
+ - `/etc/profile`
+ - `~/.ssh/config`
- `--highlight-line` now accepts line ranges, see #809 (@lkalir)
- Proper wrapping support for output with wide Unicode characters, see #811 #787 and #815 (@Kogia-sima)
@@ -1138,13 +1128,13 @@ You can see the API documentation here: https://docs.rs/bat/
## Bugfixes
-* Using `bat cache --init` leads to duplicated syntaxes, see #206
+- Using `bat cache --init` leads to duplicated syntaxes, see #206
## Other
-* Extended and cleaned-up `--help` text.
-* Added initial version of a man page, see #52
-* New README sections: *Development* and *Troubleshooting*, see #220
+- Extended and cleaned-up `--help` text.
+- Added initial version of a man page, see #52
+- New README sections: *Development* and *Troubleshooting*, see #220
# v0.5.0
@@ -1185,23 +1175,23 @@ You can see the API documentation here: https://docs.rs/bat/
## Features
-* Support for line-wrapping, see #54 and #102 (@eth-p)
-* New and updated `--style` parameter, see #74 and README (@pitkley)
-* Added `--theme` and `--list-themes` options, see #89 (@rleungx)
-* Added syntax highlighting for: Julia (@iamed2), Dockerfiles, VimL, CMake, INI, Less
-* Added a few popular Sublime Text highlighting themes, see #133
-* Support for bold, italic and underline font styles, see #96
-* Support for 32bit systems is now available, see #84
-* Added `-u` and `-n` options, see #134
-* ANSI color support on Windows 10
+- Support for line-wrapping, see #54 and #102 (@eth-p)
+- New and updated `--style` parameter, see #74 and README (@pitkley)
+- Added `--theme` and `--list-themes` options, see #89 (@rleungx)
+- Added syntax highlighting for: Julia (@iamed2), Dockerfiles, VimL, CMake, INI, Less
+- Added a few popular Sublime Text highlighting themes, see #133
+- Support for bold, italic and underline font styles, see #96
+- Support for 32bit systems is now available, see #84
+- Added `-u` and `-n` options, see #134
+- ANSI color support on Windows 10
## Changes
-* The customization folder for own syntaxes has been renamed from `syntax` to `syntaxes`, see README.
-* Changed Markdown syntax to the default Sublime Text syntax, see #157
-* Sorted language listing (@rleungx)
-* Command line arguments like `--theme` or `--color` can now override themselves.
-* Improved `--help` text.
+- The customization folder for own syntaxes has been renamed from `syntax` to `syntaxes`, see README.
+- Changed Markdown syntax to the default Sublime Text syntax, see #157
+- Sorted language listing (@rleungx)
+- Command line arguments like `--theme` or `--color` can now override themselves.
+- Improved `--help` text.
## Bugfixes
@@ -1223,24 +1213,24 @@ You can see the API documentation here: https://docs.rs/bat/
## Features
-* Automatic paging by integrating with `less`, see #29 (@BrainMaestro)
-* Added support for reading from standard input, see #2
-* Added support for writing to non-interactive terminals (pipes, files, ..); new
+- Automatic paging by integrating with `less`, see #29 (@BrainMaestro)
+- Added support for reading from standard input, see #2
+- Added support for writing to non-interactive terminals (pipes, files, ..); new
`--color=auto/always/never` option, see #26 (@BrainMaestro)
-* Added `--list-languages` option to print all available syntaxes, see #69 (@connorkuehl)
-* New option to specify the syntax via `-l`/`--language`, see #19 (@BrainMaestro)
-* New option to control the output style (`--style`), see #5 (@nakulcg)
-* Added syntax highlighting support for TOML files, see #37
+- Added `--list-languages` option to print all available syntaxes, see #69 (@connorkuehl)
+- New option to specify the syntax via `-l`/`--language`, see #19 (@BrainMaestro)
+- New option to control the output style (`--style`), see #5 (@nakulcg)
+- Added syntax highlighting support for TOML files, see #37
## Changes
-* The `init-cache` sub-command has been removed. The cache can now be controlled via
+- The `init-cache` sub-command has been removed. The cache can now be controlled via
`bat cache`. See `bat cache -h` for all available commands.
## Bug fixes
-* Get git repository from file path instead of current directory, see #22 (@nakulcg)
-* Process substitution can now be used with bat (`bat <(echo a) <(echo b)`), see #80
+- Get git repository from file path instead of current directory, see #22 (@nakulcg)
+- Process substitution can now be used with bat (`bat <(echo a) <(echo b)`), see #80
## Thanks
diff --git a/src/line_range.rs b/src/line_range.rs
index b0d93594..f37c855b 100644
--- a/src/line_range.rs
+++ b/src/line_range.rs
@@ -106,7 +106,7 @@ impl LineRange {
.map_err(|_| "Invalid line number in N::C format")?;
let context: usize = line_numbers[2].parse()
.map_err(|_| "Invalid context number in N::C format")?;
-
+
new_range.lower = RangeBound::Absolute(line_number.saturating_sub(context));
new_range.upper = RangeBound::Absolute(line_number.saturating_add(context));
} else {
@@ -117,7 +117,7 @@ impl LineRange {
.map_err(|_| "Invalid end line number in N:M:C format")?;
let context: usize = line_numbers[2].parse()
.map_err(|_| "Invalid context number in N:M:C format")?;
-
+
new_range.lower = RangeBound::Absolute(start_line.saturating_sub(context));
new_range.upper = RangeBound::Absolute(end_line.saturating_add(context));
}
@@ -319,12 +319,12 @@ fn test_parse_context_edge_cases() {
let range = LineRange::from("5::10").expect("Shouldn't fail on test!");
assert_eq!(RangeBound::Absolute(0), range.lower);
assert_eq!(RangeBound::Absolute(15), range.upper);
-
+
// Test with zero context
let range = LineRange::from("50::0").expect("Shouldn't fail on test!");
assert_eq!(RangeBound::Absolute(50), range.lower);
assert_eq!(RangeBound::Absolute(50), range.upper);
-
+
// Test range with zero context
let range = LineRange::from("30:40:0").expect("Shouldn't fail on test!");
assert_eq!(RangeBound::Absolute(30), range.lower);