1
0
mirror of https://github.com/BurntSushi/ripgrep.git synced 2025-04-24 17:12:16 +02:00

printer: add support for line number alignment

Closes #544
This commit is contained in:
Balaji Sivaraman 2018-01-01 19:30:31 +05:30 committed by Andrew Gallant
parent 5e73075ef5
commit ba1023e1e4
7 changed files with 69 additions and 3 deletions

View File

@ -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'

View File

@ -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

View File

@ -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.

View File

@ -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())
} }

View File

@ -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),

View File

@ -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]);
} }

View File

@ -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);