diff --git a/src/searcher.rs b/src/searcher.rs index c63c826..4f346b7 100644 --- a/src/searcher.rs +++ b/src/searcher.rs @@ -407,21 +407,33 @@ impl<'a> Searcher<'a> { path: &Path, view: &LineView<'_>, ) -> io::Result<()> { + let last_printed_line = self.session_last_printed_line; + let mut context = self.session_context_buf.drain_iter().peekable(); + + while context + .peek() + .is_some_and(|ctx| ctx.line_number <= last_printed_line) + { + context.next(); + } + + let group_start_line = context + .peek() + .map_or(view.line_number, |ctx| ctx.line_number); + // Group separator between non-adjacent groups. // `last_printed_line == 0` means we haven't printed anything yet. // = first group = skip the separator if self.config.has_context - && self.session_last_printed_line > 0 - && view.line_number > self.session_last_printed_line + 1 + && last_printed_line > 0 + && group_start_line > last_printed_line + 1 { self.writer.write_group_separator()?; } - for ctx in self.session_context_buf.drain_iter() { - if ctx.line_number > self.session_last_printed_line { - self.writer.write_line(&ctx.view(), path)?; - self.session_last_printed_line = ctx.line_number; - } + for ctx in context { + self.writer.write_line(&ctx.view(), path)?; + self.session_last_printed_line = ctx.line_number; } self.writer.write_line(view, path)?; diff --git a/tests/test_grep.rs b/tests/test_grep.rs index d061918..b0305c9 100644 --- a/tests/test_grep.rs +++ b/tests/test_grep.rs @@ -734,6 +734,15 @@ fn group_separator_behavior() { .stdout_only("M\n***\nM\n"); } +#[test] +fn adjacent_context_groups_do_not_get_separator() { + let (_s, mut c) = ucmd(); + c.args(&["-e", ".", "-B", "2"]) + .pipe_in("a\nb\n\n\nc\n") + .succeeds() + .stdout_only("a\nb\n\n\nc\n"); +} + #[test] fn overlapping_context_not_duplicated() { let (_s, mut c) = ucmd();