summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndrew Gallant <jamslam@gmail.com>2016-09-06 19:50:27 -0400
committerAndrew Gallant <jamslam@gmail.com>2016-09-06 19:50:27 -0400
commit5938bed339d820865d4d3e4bab742cb7afce9412 (patch)
treee68f18c0bb9d5bbec9fc514ee03702629ce26d21 /src
parentfeff1849c8e51e7a78745816fd3395a24406fafc (diff)
Add support for printing column numbers.
Diffstat (limited to 'src')
-rw-r--r--src/args.rs9
-rw-r--r--src/printer.rs15
2 files changed, 24 insertions, 0 deletions
diff --git a/src/args.rs b/src/args.rs
index ed129439..e5320110 100644
--- a/src/args.rs
+++ b/src/args.rs
@@ -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)
diff --git a/src/printer.rs b/src/printer.rs
index be0f6f78..6204d5b5 100644
--- a/src/printer.rs
+++ b/src/printer.rs
@@ -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());