1
0
mirror of https://github.com/BurntSushi/ripgrep.git synced 2024-12-12 19:18:24 +02:00

Add support for printing column numbers.

This commit is contained in:
Andrew Gallant 2016-09-06 19:50:27 -04:00
parent feff1849c8
commit 5938bed339
2 changed files with 24 additions and 0 deletions

View File

@ -75,6 +75,11 @@ Less common options:
-C, --context NUM
Show NUM lines before and after each match.
--column
Show column numbers (1 based) in output. This only shows the column
numbers for the first match on each line. Note that this doesn't try
to account for Unicode. One byte is equal to one column.
--context-separator ARG
The string to use when separating non-continuous context lines. Escape
sequences may be used. [default: --]
@ -146,6 +151,7 @@ pub struct RawArgs {
flag_after_context: usize,
flag_before_context: usize,
flag_color: String,
flag_column: bool,
flag_context: usize,
flag_context_separator: String,
flag_count: bool,
@ -186,6 +192,7 @@ pub struct Args {
after_context: usize,
before_context: usize,
color: bool,
column: bool,
context_separator: Vec<u8>,
count: bool,
eol: u8,
@ -296,6 +303,7 @@ impl RawArgs {
after_context: after_context,
before_context: before_context,
color: color,
column: self.flag_column,
context_separator: unescape(&self.flag_context_separator),
count: self.flag_count,
eol: eol,
@ -401,6 +409,7 @@ impl Args {
/// writer given.
pub fn printer<W: Send + io::Write>(&self, wtr: W) -> Printer<W> {
let mut p = Printer::new(wtr, self.color)
.column(self.column)
.context_separator(self.context_separator.clone())
.eol(self.eol)
.heading(self.heading)

View File

@ -22,6 +22,8 @@ pub struct Printer<W> {
wtr: Writer<W>,
/// Whether anything has been printed to wtr yet.
has_printed: bool,
/// Whether to show column numbers for the first match or not.
column: bool,
/// The string to use to separate non-contiguous runs of context lines.
context_separator: Vec<u8>,
/// The end-of-line terminator used by the printer. In general, eols are
@ -48,6 +50,7 @@ impl<W: Send + io::Write> Printer<W> {
Printer {
wtr: Writer::new(wtr, color),
has_printed: false,
column: false,
context_separator: "--".to_string().into_bytes(),
eol: b'\n',
heading: false,
@ -57,6 +60,13 @@ impl<W: Send + io::Write> Printer<W> {
}
}
/// When set, column numbers will be printed for the first match on each
/// line.
pub fn column(mut self, yes: bool) -> Printer<W> {
self.column = yes;
self
}
/// Set the context separator. The default is `--`.
pub fn context_separator(mut self, sep: Vec<u8>) -> Printer<W> {
self.context_separator = sep;
@ -173,6 +183,11 @@ impl<W: Send + io::Write> Printer<W> {
if let Some(line_number) = line_number {
self.line_number(line_number, b':');
}
if self.column {
let c = re.find(&buf[start..end]).map(|(s, _)| s + 1).unwrap_or(0);
self.write(c.to_string().as_bytes());
self.write(b":");
}
if self.replace.is_some() {
let line = re.replace_all(
&buf[start..end], &**self.replace.as_ref().unwrap());