printer: add --passthru flag

The --passthru flag causes ripgrep to print every line,
even if the line does not contain a match. This is a
response to the common pattern of `^|foo` to match every
line, while still highlighting things like `foo`.

Fixes #740
This commit is contained in:
dana
2018-01-11 17:45:51 -06:00
committed by Andrew Gallant
parent 34c0b1bc70
commit 58bdc366ec
6 changed files with 84 additions and 5 deletions

View File

@@ -166,6 +166,8 @@ pub fn app() -> App<'static, 'static> {
.arg(flag("no-ignore-vcs"))
.arg(flag("null").short("0"))
.arg(flag("only-matching").short("o"))
.arg(flag("passthru").alias("passthrough")
.conflicts_with_all(&["only-matching", "replace"]))
.arg(flag("path-separator").value_name("SEPARATOR").takes_value(true))
.arg(flag("pretty").short("p"))
.arg(flag("replace").short("r")
@@ -499,6 +501,8 @@ lazy_static! {
"Print only matched parts of a line.",
"Print only the matched (non-empty) parts of a matching line, \
with each such part on a separate output line.");
doc!(h, "passthru",
"Show both matching and non-matching lines.");
doc!(h, "path-separator",
"Path separator to use when printing file paths.",
"The path separator to use when printing file paths. This \

View File

@@ -433,7 +433,9 @@ impl<'a> ArgMatches<'a> {
/// Note that if -F/--fixed-strings is set, then all patterns will be
/// escaped. Similarly, if -w/--word-regexp is set, then all patterns
/// are surrounded by `\b`, and if -x/--line-regexp is set, then all
/// patterns are surrounded by `^...$`.
/// patterns are surrounded by `^...$`. Finally, if --passthru is set,
/// the pattern `^` is added to the end (to ensure that it works as
/// expected with multiple -e/-f patterns).
///
/// If any pattern is invalid UTF-8, then an error is returned.
fn patterns(&self) -> Result<Vec<String>> {
@@ -470,7 +472,11 @@ impl<'a> ArgMatches<'a> {
}
}
}
if pats.is_empty() {
// It's important that this be at the end; otherwise it would always
// match first, and we wouldn't get colours in the output
if self.is_present("passthru") && !self.is_present("count") {
pats.push("^".to_string())
} else if pats.is_empty() {
pats.push(self.empty_pattern())
}
Ok(pats)