From 1a6709c2cb3d8403e2f709a7e8b66c031216e559 Mon Sep 17 00:00:00 2001 From: Taylor Date: Tue, 9 Oct 2018 22:25:33 -0600 Subject: [PATCH 1/3] add line highlight --- src/app.rs | 4 ++++ src/clap_app.rs | 11 +++++++++++ src/printer.rs | 21 ++++++++++++++++++++- src/terminal.rs | 4 +++- 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/app.rs b/src/app.rs index 91a87975..360c7304 100644 --- a/src/app.rs +++ b/src/app.rs @@ -64,6 +64,9 @@ pub struct Config<'a> { /// The syntax highlighting theme pub theme: String, + + /// A line to highlight + pub highlight_line: Option, } fn is_truecolor_terminal() -> bool { @@ -182,6 +185,7 @@ impl App { .or_else(|| env::var("BAT_THEME").ok()) .unwrap_or(String::from(BAT_THEME_DEFAULT)), line_range: transpose(self.matches.value_of("line-range").map(LineRange::from))?, + highlight_line: self.matches.value_of("highlight-line").and_then(|w| w.parse().ok()), output_components, }) } diff --git a/src/clap_app.rs b/src/clap_app.rs index ab1881db..11d79b51 100644 --- a/src/clap_app.rs +++ b/src/clap_app.rs @@ -141,6 +141,17 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> { '--line-range 40:' prints lines 40 to the end of the file", ), ) + .arg( + Arg::with_name("highlight-line") + .long("highlight-line") + .overrides_with("highlight-line") + .takes_value(true) + .value_name("n") + .help("Highlight a line.") + .long_help( + "Highlight the nth line. The background color is changed to create contrast.", + ), + ) .arg( Arg::with_name("color") .long("color") diff --git a/src/printer.rs b/src/printer.rs index 5bb72fc8..03f01f97 100644 --- a/src/printer.rs +++ b/src/printer.rs @@ -7,6 +7,7 @@ use ansi_term::Style; use console::AnsiCodeIterator; use syntect::easy::HighlightLines; +use syntect::highlighting::Color; use syntect::highlighting::Theme; use syntect::parsing::SyntaxSet; @@ -79,6 +80,7 @@ pub struct InteractivePrinter<'a> { pub line_changes: Option, highlighter: Option>, syntax_set: &'a SyntaxSet, + background_highlight: Option, } impl<'a> InteractivePrinter<'a> { @@ -90,6 +92,8 @@ impl<'a> InteractivePrinter<'a> { ) -> Self { let theme = assets.get_theme(&config.theme); + let background_highlight = theme.settings.line_highlight; + let colors = if config.colored_output { Colors::colored(theme, config.true_color) } else { @@ -156,6 +160,7 @@ impl<'a> InteractivePrinter<'a> { line_changes, highlighter, syntax_set: &assets.syntax_set, + background_highlight, } } @@ -296,6 +301,18 @@ impl<'a> Printer for InteractivePrinter<'a> { } } + // Line highlighting + let background = match self.config.highlight_line { + Some(line) => { + if line_number == line { + self.background_highlight + } else { + None + } + } + _ => None + }; + // Line contents. if self.config.output_wrap == OutputWrap::None { let true_color = self.config.true_color; @@ -306,7 +323,7 @@ impl<'a> Printer for InteractivePrinter<'a> { write!( handle, "{}", - as_terminal_escaped(style, &*text, true_color, colored_output,) + as_terminal_escaped(style, &*text, true_color, colored_output, background) )?; } @@ -362,6 +379,7 @@ impl<'a> Printer for InteractivePrinter<'a> { ), self.config.true_color, self.config.colored_output, + background ) )?; break; @@ -401,6 +419,7 @@ impl<'a> Printer for InteractivePrinter<'a> { ), self.config.true_color, self.config.colored_output, + background ), panel_wrap.clone().unwrap() )?; diff --git a/src/terminal.rs b/src/terminal.rs index 7a6850ca..b634357a 100644 --- a/src/terminal.rs +++ b/src/terminal.rs @@ -18,8 +18,9 @@ pub fn as_terminal_escaped( text: &str, true_color: bool, colored: bool, + background_color: Option, ) -> String { - let style = if !colored { + let mut style = if !colored { Style::default() } else { let color = to_ansi_color(style.foreground, true_color); @@ -35,5 +36,6 @@ pub fn as_terminal_escaped( } }; + style.background = background_color.map(|c| to_ansi_color(c, true_color)); style.paint(text).to_string() } From 2a7851530dbf37ade9e5493c021d34fb4f3e700b Mon Sep 17 00:00:00 2001 From: sharkdp Date: Wed, 10 Oct 2018 20:45:10 +0200 Subject: [PATCH 2/3] Fix formatting --- src/app.rs | 5 ++++- src/printer.rs | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/app.rs b/src/app.rs index 360c7304..8fdb61c3 100644 --- a/src/app.rs +++ b/src/app.rs @@ -185,7 +185,10 @@ impl App { .or_else(|| env::var("BAT_THEME").ok()) .unwrap_or(String::from(BAT_THEME_DEFAULT)), line_range: transpose(self.matches.value_of("line-range").map(LineRange::from))?, - highlight_line: self.matches.value_of("highlight-line").and_then(|w| w.parse().ok()), + highlight_line: self + .matches + .value_of("highlight-line") + .and_then(|w| w.parse().ok()), output_components, }) } diff --git a/src/printer.rs b/src/printer.rs index 03f01f97..68b2a998 100644 --- a/src/printer.rs +++ b/src/printer.rs @@ -309,8 +309,8 @@ impl<'a> Printer for InteractivePrinter<'a> { } else { None } - } - _ => None + } + _ => None, }; // Line contents. From cea05e9f22b40edf2ccd2a0676827974796972a2 Mon Sep 17 00:00:00 2001 From: Taylor Date: Wed, 10 Oct 2018 22:19:40 -0600 Subject: [PATCH 3/3] be consistent --- src/clap_app.rs | 4 ++-- src/printer.rs | 14 ++++---------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/clap_app.rs b/src/clap_app.rs index 11d79b51..36a4b60f 100644 --- a/src/clap_app.rs +++ b/src/clap_app.rs @@ -146,10 +146,10 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> { .long("highlight-line") .overrides_with("highlight-line") .takes_value(true) - .value_name("n") + .value_name("N") .help("Highlight a line.") .long_help( - "Highlight the nth line. The background color is changed to create contrast.", + "Highlight the Nth line. The background color is changed to create contrast.", ), ) .arg( diff --git a/src/printer.rs b/src/printer.rs index 68b2a998..dd4abdd9 100644 --- a/src/printer.rs +++ b/src/printer.rs @@ -302,16 +302,10 @@ impl<'a> Printer for InteractivePrinter<'a> { } // Line highlighting - let background = match self.config.highlight_line { - Some(line) => { - if line_number == line { - self.background_highlight - } else { - None - } - } - _ => None, - }; + let background = self.config.highlight_line + .filter(|line| *line == line_number) + .map(|_| self.background_highlight) + .unwrap(); // Line contents. if self.config.output_wrap == OutputWrap::None {