From 1a6709c2cb3d8403e2f709a7e8b66c031216e559 Mon Sep 17 00:00:00 2001 From: Taylor Date: Tue, 9 Oct 2018 22:25:33 -0600 Subject: [PATCH] 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() }