1
0
mirror of https://github.com/sharkdp/bat synced 2026-08-01 18:31:46 +00:00

Fix -n flag to show line numbers in loop-through mode

When the -n/--number flag is passed on the command line, bat now shows
line numbers even when piping output to another process (loop-through
mode), similar to how `cat -n` behaves.

This change detects if -n or --number was passed on the CLI (before
merging with config file and environment variables) and disables
loop-through mode in that case, allowing the InteractivePrinter to
add line numbers.

The existing behavior is preserved:
- Styles from config/env are still ignored when piping (unless --decorations=always is set)
- Only the -n flag from CLI enables line numbers in piped mode
- -p and --style options from CLI do not disable loop-through mode
This commit is contained in:
Keith Hall
2025-11-29 17:21:37 +02:00
parent f9c33971d9
commit abc7261488
3 changed files with 28 additions and 3 deletions
+15 -1
View File
@@ -46,6 +46,10 @@ enum HelpType {
pub struct App {
pub matches: ArgMatches,
interactive_output: bool,
/// True if -n / --number was passed on the command line
/// (not from config file or environment variables).
/// This is used to honor the flag when piping output, similar to `cat -n`.
number_from_cli: bool,
}
impl App {
@@ -54,6 +58,15 @@ impl App {
let _ = nu_ansi_term::enable_ansi_support();
let interactive_output = std::io::stdout().is_terminal();
// Check if the -n / --number option was passed on the command line
// (before merging with config file and environment variables).
// This is needed to honor the -n flag when piping output, similar to `cat -n`.
let number_from_cli = wild::args_os().any(|arg| {
let arg_str = arg.to_string_lossy();
arg_str == "-n" || arg_str == "--number"
});
let matches = Self::matches(interactive_output)?;
if matches.get_flag("help") {
@@ -91,6 +104,7 @@ impl App {
Ok(App {
matches,
interactive_output,
number_from_cli,
})
}
@@ -384,7 +398,7 @@ impl App {
.map(|s| s.as_str())
== Some("always")
|| self.matches.get_flag("force-colorization")
|| self.matches.get_flag("number")),
|| self.number_from_cli),
tab_width: self
.matches
.get_one::<String>("tabs")