1
0
mirror of https://github.com/BurntSushi/ripgrep.git synced 2025-04-14 00:58:43 +02:00

Add support for searching multiple patterns with -e.

Also, change -Q/--literal to -F/--fixed-strings because compatibility
with grep is probably better.
This commit is contained in:
Andrew Gallant 2016-09-17 16:55:58 -04:00
parent 0a63158a61
commit f7ee914dd3
2 changed files with 40 additions and 20 deletions

View File

@ -35,13 +35,14 @@ use Result;
/// If you've never heard of Docopt before, see: http://docopt.org /// If you've never heard of Docopt before, see: http://docopt.org
/// (TL;DR: The CLI parser is generated from the usage string below.) /// (TL;DR: The CLI parser is generated from the usage string below.)
const USAGE: &'static str = " const USAGE: &'static str = "
Usage: rg [options] <pattern> [<path> ...] Usage: rg [options] -e PATTERN ... [<path> ...]
rg [options] <pattern> [<path> ...]
rg [options] --files [<path> ...] rg [options] --files [<path> ...]
rg [options] --type-list rg [options] --type-list
rg --help rg --help
rg --version rg --version
rg combines the usability of the silver search with the raw speed of grep. rg combines the usability of The Silver Searcher with the raw speed of grep.
Common options: Common options:
-a, --text Search binary files as if they were text. -a, --text Search binary files as if they were text.
@ -49,6 +50,11 @@ Common options:
--color WHEN Whether to use coloring in match. --color WHEN Whether to use coloring in match.
Valid values are never, always or auto. Valid values are never, always or auto.
[default: auto] [default: auto]
-e, --regexp PATTERN ... Use PATTERN to search. This option can be
provided multiple times, where all patterns
given are searched.
-F, --fixed-strings Treat the pattern as a literal string instead of
a regular expression.
-g, --glob GLOB ... Include or exclude files for searching that -g, --glob GLOB ... Include or exclude files for searching that
match the given glob. This always overrides any match the given glob. This always overrides any
other ignore logic. Multiple glob flags may be other ignore logic. Multiple glob flags may be
@ -134,9 +140,6 @@ Less common options:
-p, --pretty -p, --pretty
Alias for --color=always --heading -n. Alias for --color=always --heading -n.
-Q, --literal
Treat the pattern as a literal string instead of a regular expression.
-j, --threads ARG -j, --threads ARG
The number of threads to use. Defaults to the number of logical CPUs The number of threads to use. Defaults to the number of logical CPUs
(capped at 6). [default: 0] (capped at 6). [default: 0]
@ -178,7 +181,7 @@ pub struct RawArgs {
flag_ignore_case: bool, flag_ignore_case: bool,
flag_invert_match: bool, flag_invert_match: bool,
flag_line_number: bool, flag_line_number: bool,
flag_literal: bool, flag_fixed_strings: bool,
flag_mmap: bool, flag_mmap: bool,
flag_no_heading: bool, flag_no_heading: bool,
flag_no_ignore: bool, flag_no_ignore: bool,
@ -187,6 +190,7 @@ pub struct RawArgs {
flag_no_mmap: bool, flag_no_mmap: bool,
flag_pretty: bool, flag_pretty: bool,
flag_quiet: bool, flag_quiet: bool,
flag_regexp: Vec<String>,
flag_replace: Option<String>, flag_replace: Option<String>,
flag_text: bool, flag_text: bool,
flag_threads: usize, flag_threads: usize,
@ -236,19 +240,7 @@ pub struct Args {
impl RawArgs { impl RawArgs {
/// Convert arguments parsed into a configuration used by ripgrep. /// Convert arguments parsed into a configuration used by ripgrep.
fn to_args(&self) -> Result<Args> { fn to_args(&self) -> Result<Args> {
let pattern = { let pattern = self.pattern();
let pattern =
if self.flag_literal {
regex::quote(&self.arg_pattern)
} else {
self.arg_pattern.clone()
};
if self.flag_word_regexp {
format!(r"\b{}\b", pattern)
} else {
pattern
}
};
let paths = let paths =
if self.arg_path.is_empty() { if self.arg_path.is_empty() {
if atty::on_stdin() if atty::on_stdin()
@ -380,6 +372,34 @@ impl RawArgs {
} }
Ok(()) Ok(())
} }
fn pattern(&self) -> String {
if !self.flag_regexp.is_empty() {
if self.flag_fixed_strings {
self.flag_regexp.iter().cloned().map(|lit| {
self.word_pattern(regex::quote(&lit))
}).collect::<Vec<String>>().join("|")
} else {
self.flag_regexp.iter().cloned().map(|pat| {
self.word_pattern(pat)
}).collect::<Vec<String>>().join("|")
}
} else {
if self.flag_fixed_strings {
self.word_pattern(regex::quote(&self.arg_pattern))
} else {
self.word_pattern(self.arg_pattern.clone())
}
}
}
fn word_pattern(&self, s: String) -> String {
if self.flag_word_regexp {
format!(r"\b{}\b", s)
} else {
s
}
}
} }
impl Args { impl Args {

View File

@ -166,7 +166,7 @@ For the Doctor Watsons of this world, as opposed to the Sherlock
sherlock!(literal, "()", "file", |wd: WorkDir, mut cmd: Command| { sherlock!(literal, "()", "file", |wd: WorkDir, mut cmd: Command| {
wd.create("file", "blib\n()\nblab\n"); wd.create("file", "blib\n()\nblab\n");
cmd.arg("-Q"); cmd.arg("-F");
let lines: String = wd.stdout(&mut cmd); let lines: String = wd.stdout(&mut cmd);
assert_eq!(lines, "()\n"); assert_eq!(lines, "()\n");
}); });