summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsharkdp <davidpeter@web.de>2018-08-19 12:32:35 +0200
committersharkdp <davidpeter@web.de>2018-08-19 12:32:35 +0200
commit25083232640dfe06334c929cb16333a9bd873195 (patch)
tree1e062aa28d50d2c8193e3c26e871e1f8c3f4f6b8
parent297afad337a1ba6299e17a1f8054e7f6b1ae3d27 (diff)
Extract grid and line-number color from themev0.5.0
This changes the output color of the grid and the line numbers to use the "gutter" foreground color defined in the Sublime `.tmTheme` files. Sublime Text does the same. Note: we could go one step further and also extract the "GitGutter" colors from the themes. These could be used instead of red/green/yellow to signify Git modifications. The problem is that they are quite a bit harder to extract from the syntect `Theme` object. closes #178
-rw-r--r--src/features.rs2
-rw-r--r--src/printer.rs27
-rw-r--r--src/terminal.rs18
3 files changed, 28 insertions, 19 deletions
diff --git a/src/features.rs b/src/features.rs
index 294c76a6..151901e9 100644
--- a/src/features.rs
+++ b/src/features.rs
@@ -61,7 +61,7 @@ pub fn print_files(assets: &HighlightingAssets, config: &Config) -> Result<bool>
let mut output_type = OutputType::from_mode(config.paging_mode);
let handle = output_type.handle()?;
- let mut printer = Printer::new(handle, &config);
+ let mut printer = Printer::new(handle, &config, &theme);
let mut no_errors: bool = true;
for file in &config.files {
diff --git a/src/printer.rs b/src/printer.rs
index 52f0cd9e..7b288538 100644
--- a/src/printer.rs
+++ b/src/printer.rs
@@ -1,4 +1,4 @@
-use ansi_term::Colour::{Fixed, Green, Red, White, Yellow};
+use ansi_term::Colour::{Fixed, Green, Red, Yellow};
use ansi_term::Style;
use app::Config;
use console::AnsiCodeIterator;
@@ -9,8 +9,8 @@ use std::boxed::Box;
use std::io::Write;
use std::vec::Vec;
use style::OutputWrap;
-use syntect::highlighting;
-use terminal::as_terminal_escaped;
+use syntect::highlighting::{self, Theme};
+use terminal::{as_terminal_escaped, to_ansi_color};
pub struct Printer<'a> {
handle: &'a mut Write,
@@ -24,9 +24,9 @@ pub struct Printer<'a> {
}
impl<'a> Printer<'a> {
- pub fn new(handle: &'a mut Write, config: &'a Config) -> Self {
+ pub fn new(handle: &'a mut Write, config: &'a Config, theme: &Theme) -> Self {
let colors = if config.colored_output {
- Colors::colored()
+ Colors::colored(theme, config.true_color)
} else {
Colors::plain()
};
@@ -274,8 +274,7 @@ impl<'a> Printer<'a> {
}
}
-const GRID_COLOR: u8 = 238;
-const LINE_NUMBER_COLOR: u8 = 244;
+const DEFAULT_GUTTER_COLOR: u8 = 238;
#[derive(Default)]
pub struct Colors {
@@ -292,14 +291,20 @@ impl Colors {
Colors::default()
}
- fn colored() -> Self {
+ fn colored(theme: &Theme, true_color: bool) -> Self {
+ let gutter_color = theme
+ .settings
+ .gutter_foreground
+ .map(|c| to_ansi_color(c, true_color))
+ .unwrap_or(Fixed(DEFAULT_GUTTER_COLOR));
+
Colors {
- grid: Fixed(GRID_COLOR).normal(),
- filename: White.bold(),
+ grid: gutter_color.normal(),
+ filename: Style::new().bold(),
git_added: Green.normal(),
git_removed: Red.normal(),
git_modified: Yellow.normal(),
- line_number: Fixed(LINE_NUMBER_COLOR).normal(),
+ line_number: gutter_color.normal(),
}
}
}
diff --git a/src/terminal.rs b/src/terminal.rs
index 3b0f82ae..64f61de4 100644
--- a/src/terminal.rs
+++ b/src/terminal.rs
@@ -1,5 +1,5 @@
use ansi_term::Colour::{Fixed, RGB};
-use ansi_term::Style;
+use ansi_term::{self, Style};
use syntect::highlighting::{self, FontStyle};
/// Approximate a 24 bit color value by a 8 bit ANSI code
@@ -20,6 +20,15 @@ fn rgb2ansi(r: u8, g: u8, b: u8) -> u8 {
}
}
+pub fn to_ansi_color(color: highlighting::Color, true_color: bool) -> ansi_term::Colour {
+ if true_color {
+ RGB(color.r, color.g, color.b)
+ } else {
+ let ansi_code = rgb2ansi(color.r, color.g, color.b);
+ Fixed(ansi_code)
+ }
+}
+
pub fn as_terminal_escaped(
style: highlighting::Style,
text: &str,
@@ -29,12 +38,7 @@ pub fn as_terminal_escaped(
let style = if !colored {
Style::default()
} else {
- let color = if true_color {
- RGB(style.foreground.r, style.foreground.g, style.foreground.b)
- } else {
- let ansi = rgb2ansi(style.foreground.r, style.foreground.g, style.foreground.b);
- Fixed(ansi)
- };
+ let color = to_ansi_color(style.foreground, true_color);
if style.font_style.contains(FontStyle::BOLD) {
color.bold()