mirror of
https://github.com/BurntSushi/ripgrep.git
synced 2025-04-24 17:12:16 +02:00
parent
5e73075ef5
commit
ba1023e1e4
@ -45,6 +45,7 @@ _rg() {
|
|||||||
'--ignore-file=[specify additional ignore file]:file:_files'
|
'--ignore-file=[specify additional ignore file]:file:_files'
|
||||||
'(-v --invert-match)'{-v,--invert-match}'[invert matching]'
|
'(-v --invert-match)'{-v,--invert-match}'[invert matching]'
|
||||||
'(-n -N --line-number --no-line-number)'{-n,--line-number}'[show line numbers]'
|
'(-n -N --line-number --no-line-number)'{-n,--line-number}'[show line numbers]'
|
||||||
|
'(-N --no-line-number)--line-number-width=[specify width of displayed line number]:number of columns'
|
||||||
'(-w -x --line-regexp --word-regexp)'{-x,--line-regexp}'[only show matches surrounded by line boundaries]'
|
'(-w -x --line-regexp --word-regexp)'{-x,--line-regexp}'[only show matches surrounded by line boundaries]'
|
||||||
'(-M --max-columns)'{-M+,--max-columns=}'[specify max length of lines to print]:number of bytes'
|
'(-M --max-columns)'{-M+,--max-columns=}'[specify max length of lines to print]:number of bytes'
|
||||||
'(-m --max-count)'{-m+,--max-count=}'[specify max number of matches per file]:number of matches'
|
'(-m --max-count)'{-m+,--max-count=}'[specify max number of matches per file]:number of matches'
|
||||||
|
8
doc/rg.1
8
doc/rg.1
@ -335,6 +335,14 @@ Follow symlinks.
|
|||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
|
.B \-\-line\-number\-width \f[I]NUM\f[]
|
||||||
|
Specify a width for the displayed line number.
|
||||||
|
If number of digits in the line number is less than this number, it is
|
||||||
|
left padded with spaces.
|
||||||
|
Note: This setting has no effect if \-\-no\-line\-number is enabled.
|
||||||
|
.RS
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
.B \-M, \-\-max\-columns \f[I]NUM\f[]
|
.B \-M, \-\-max\-columns \f[I]NUM\f[]
|
||||||
Don\[aq]t print lines longer than this limit in bytes.
|
Don\[aq]t print lines longer than this limit in bytes.
|
||||||
Longer lines are omitted, and only the number of matches in that line is
|
Longer lines are omitted, and only the number of matches in that line is
|
||||||
|
@ -222,6 +222,12 @@ Project home page: https://github.com/BurntSushi/ripgrep
|
|||||||
-L, --follow
|
-L, --follow
|
||||||
: Follow symlinks.
|
: Follow symlinks.
|
||||||
|
|
||||||
|
--line-number-width *NUM*
|
||||||
|
: Specify a width for the displayed line number. If number of digits
|
||||||
|
in the line number is less than this number, it is left padded with
|
||||||
|
spaces. Note: This setting has no effect if --no-line-number is
|
||||||
|
enabled.
|
||||||
|
|
||||||
-M, --max-columns *NUM*
|
-M, --max-columns *NUM*
|
||||||
: Don't print lines longer than this limit in bytes. Longer lines are omitted,
|
: Don't print lines longer than this limit in bytes. Longer lines are omitted,
|
||||||
and only the number of matches in that line is printed.
|
and only the number of matches in that line is printed.
|
||||||
|
17
src/app.rs
17
src/app.rs
@ -102,6 +102,9 @@ pub fn app() -> App<'static, 'static> {
|
|||||||
.value_name("GLOB"))
|
.value_name("GLOB"))
|
||||||
.arg(flag("ignore-case").short("i"))
|
.arg(flag("ignore-case").short("i"))
|
||||||
.arg(flag("line-number").short("n"))
|
.arg(flag("line-number").short("n"))
|
||||||
|
.arg(flag("line-number-width")
|
||||||
|
.value_name("NUM").takes_value(true)
|
||||||
|
.validator(validate_line_number_width))
|
||||||
.arg(flag("no-line-number").short("N").overrides_with("line-number"))
|
.arg(flag("no-line-number").short("N").overrides_with("line-number"))
|
||||||
.arg(flag("quiet").short("q"))
|
.arg(flag("quiet").short("q"))
|
||||||
.arg(flag("type").short("t")
|
.arg(flag("type").short("t")
|
||||||
@ -318,6 +321,11 @@ lazy_static! {
|
|||||||
"Show line numbers.",
|
"Show line numbers.",
|
||||||
"Show line numbers (1-based). This is enabled by default when \
|
"Show line numbers (1-based). This is enabled by default when \
|
||||||
searching in a tty.");
|
searching in a tty.");
|
||||||
|
doc!(h, "line-number-width",
|
||||||
|
"Left pad line numbers upto NUM width.",
|
||||||
|
"Left pad line numbers upto NUM width. Space is used as \
|
||||||
|
the default padding character. This has no effect if \
|
||||||
|
--no-line-number is enabled.");
|
||||||
doc!(h, "no-line-number",
|
doc!(h, "no-line-number",
|
||||||
"Suppress line numbers.",
|
"Suppress line numbers.",
|
||||||
"Suppress line numbers. This is enabled by default when NOT \
|
"Suppress line numbers. This is enabled by default when NOT \
|
||||||
@ -575,6 +583,15 @@ lazy_static! {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn validate_line_number_width(s: String) -> Result<(), String> {
|
||||||
|
if s.starts_with("0") {
|
||||||
|
Err(String::from("Custom padding characters are currently not supported. \
|
||||||
|
Please enter only a numeric value."))
|
||||||
|
} else {
|
||||||
|
validate_number(s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn validate_number(s: String) -> Result<(), String> {
|
fn validate_number(s: String) -> Result<(), String> {
|
||||||
s.parse::<usize>().map(|_|()).map_err(|err| err.to_string())
|
s.parse::<usize>().map(|_|()).map_err(|err| err.to_string())
|
||||||
}
|
}
|
||||||
|
@ -54,6 +54,7 @@ pub struct Args {
|
|||||||
invert_match: bool,
|
invert_match: bool,
|
||||||
line_number: bool,
|
line_number: bool,
|
||||||
line_per_match: bool,
|
line_per_match: bool,
|
||||||
|
line_number_width: Option<usize>,
|
||||||
max_columns: Option<usize>,
|
max_columns: Option<usize>,
|
||||||
max_count: Option<u64>,
|
max_count: Option<u64>,
|
||||||
max_filesize: Option<u64>,
|
max_filesize: Option<u64>,
|
||||||
@ -144,7 +145,8 @@ impl Args {
|
|||||||
.only_matching(self.only_matching)
|
.only_matching(self.only_matching)
|
||||||
.path_separator(self.path_separator)
|
.path_separator(self.path_separator)
|
||||||
.with_filename(self.with_filename)
|
.with_filename(self.with_filename)
|
||||||
.max_columns(self.max_columns);
|
.max_columns(self.max_columns)
|
||||||
|
.line_number_width(self.line_number_width);
|
||||||
if let Some(ref rep) = self.replace {
|
if let Some(ref rep) = self.replace {
|
||||||
p = p.replace(rep.clone());
|
p = p.replace(rep.clone());
|
||||||
}
|
}
|
||||||
@ -336,6 +338,7 @@ impl<'a> ArgMatches<'a> {
|
|||||||
ignore_files: self.ignore_files(),
|
ignore_files: self.ignore_files(),
|
||||||
invert_match: self.is_present("invert-match"),
|
invert_match: self.is_present("invert-match"),
|
||||||
line_number: line_number,
|
line_number: line_number,
|
||||||
|
line_number_width: try!(self.usize_of("line-number-width")),
|
||||||
line_per_match: self.is_present("vimgrep"),
|
line_per_match: self.is_present("vimgrep"),
|
||||||
max_columns: try!(self.usize_of("max-columns")),
|
max_columns: try!(self.usize_of("max-columns")),
|
||||||
max_count: try!(self.usize_of("max-count")).map(|max| max as u64),
|
max_count: try!(self.usize_of("max-count")).map(|max| max as u64),
|
||||||
|
@ -98,7 +98,11 @@ pub struct Printer<W> {
|
|||||||
/// The separator to use for file paths. If empty, this is ignored.
|
/// The separator to use for file paths. If empty, this is ignored.
|
||||||
path_separator: Option<u8>,
|
path_separator: Option<u8>,
|
||||||
/// Restrict lines to this many columns.
|
/// Restrict lines to this many columns.
|
||||||
max_columns: Option<usize>
|
max_columns: Option<usize>,
|
||||||
|
/// Width of line number displayed. If the number of digits in the
|
||||||
|
/// line number is less than this, it is left padded with
|
||||||
|
/// spaces.
|
||||||
|
line_number_width: Option<usize>
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<W: WriteColor> Printer<W> {
|
impl<W: WriteColor> Printer<W> {
|
||||||
@ -120,6 +124,7 @@ impl<W: WriteColor> Printer<W> {
|
|||||||
colors: ColorSpecs::default(),
|
colors: ColorSpecs::default(),
|
||||||
path_separator: None,
|
path_separator: None,
|
||||||
max_columns: None,
|
max_columns: None,
|
||||||
|
line_number_width: None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -208,6 +213,12 @@ impl<W: WriteColor> Printer<W> {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Configure the width of the displayed line number
|
||||||
|
pub fn line_number_width(mut self, line_number_width: Option<usize>) -> Printer<W> {
|
||||||
|
self.line_number_width = line_number_width;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns true if and only if something has been printed.
|
/// Returns true if and only if something has been printed.
|
||||||
pub fn has_printed(&self) -> bool {
|
pub fn has_printed(&self) -> bool {
|
||||||
self.has_printed
|
self.has_printed
|
||||||
@ -457,7 +468,11 @@ impl<W: WriteColor> Printer<W> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn line_number(&mut self, n: u64, sep: u8) {
|
fn line_number(&mut self, n: u64, sep: u8) {
|
||||||
self.write_colored(n.to_string().as_bytes(), |colors| colors.line());
|
let mut line_number = n.to_string();
|
||||||
|
if let Some(width) = self.line_number_width {
|
||||||
|
line_number = format!("{:>width$}", line_number, width = width);
|
||||||
|
}
|
||||||
|
self.write_colored(line_number.as_bytes(), |colors| colors.line());
|
||||||
self.separator(&[sep]);
|
self.separator(&[sep]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,6 +103,22 @@ sherlock!(line_numbers, |wd: WorkDir, mut cmd: Command| {
|
|||||||
assert_eq!(lines, expected);
|
assert_eq!(lines, expected);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
sherlock!(line_number_width, |wd: WorkDir, mut cmd: Command| {
|
||||||
|
cmd.arg("-n");
|
||||||
|
cmd.arg("--line-number-width").arg("2");
|
||||||
|
let lines: String = wd.stdout(&mut cmd);
|
||||||
|
let expected = " 1:For the Doctor Watsons of this world, as opposed to the Sherlock
|
||||||
|
3:be, to a very large extent, the result of luck. Sherlock Holmes
|
||||||
|
";
|
||||||
|
assert_eq!(lines, expected);
|
||||||
|
});
|
||||||
|
|
||||||
|
sherlock!(line_number_width_padding_character_error, |wd: WorkDir, mut cmd: Command| {
|
||||||
|
cmd.arg("-n");
|
||||||
|
cmd.arg("--line-number-width").arg("02");
|
||||||
|
wd.assert_non_empty_stderr(&mut cmd);
|
||||||
|
});
|
||||||
|
|
||||||
sherlock!(columns, |wd: WorkDir, mut cmd: Command| {
|
sherlock!(columns, |wd: WorkDir, mut cmd: Command| {
|
||||||
cmd.arg("--column");
|
cmd.arg("--column");
|
||||||
let lines: String = wd.stdout(&mut cmd);
|
let lines: String = wd.stdout(&mut cmd);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user