Extract grid and line-number color from theme

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
This commit is contained in:
sharkdp 2018-08-19 12:32:35 +02:00
parent 297afad337
commit 2508323264
3 changed files with 28 additions and 19 deletions

View File

@ -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 mut output_type = OutputType::from_mode(config.paging_mode);
let handle = output_type.handle()?; 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; let mut no_errors: bool = true;
for file in &config.files { for file in &config.files {

View File

@ -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 ansi_term::Style;
use app::Config; use app::Config;
use console::AnsiCodeIterator; use console::AnsiCodeIterator;
@ -9,8 +9,8 @@ use std::boxed::Box;
use std::io::Write; use std::io::Write;
use std::vec::Vec; use std::vec::Vec;
use style::OutputWrap; use style::OutputWrap;
use syntect::highlighting; use syntect::highlighting::{self, Theme};
use terminal::as_terminal_escaped; use terminal::{as_terminal_escaped, to_ansi_color};
pub struct Printer<'a> { pub struct Printer<'a> {
handle: &'a mut Write, handle: &'a mut Write,
@ -24,9 +24,9 @@ pub struct Printer<'a> {
} }
impl<'a> 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 { let colors = if config.colored_output {
Colors::colored() Colors::colored(theme, config.true_color)
} else { } else {
Colors::plain() Colors::plain()
}; };
@ -274,8 +274,7 @@ impl<'a> Printer<'a> {
} }
} }
const GRID_COLOR: u8 = 238; const DEFAULT_GUTTER_COLOR: u8 = 238;
const LINE_NUMBER_COLOR: u8 = 244;
#[derive(Default)] #[derive(Default)]
pub struct Colors { pub struct Colors {
@ -292,14 +291,20 @@ impl Colors {
Colors::default() 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 { Colors {
grid: Fixed(GRID_COLOR).normal(), grid: gutter_color.normal(),
filename: White.bold(), filename: Style::new().bold(),
git_added: Green.normal(), git_added: Green.normal(),
git_removed: Red.normal(), git_removed: Red.normal(),
git_modified: Yellow.normal(), git_modified: Yellow.normal(),
line_number: Fixed(LINE_NUMBER_COLOR).normal(), line_number: gutter_color.normal(),
} }
} }
} }

View File

@ -1,5 +1,5 @@
use ansi_term::Colour::{Fixed, RGB}; use ansi_term::Colour::{Fixed, RGB};
use ansi_term::Style; use ansi_term::{self, Style};
use syntect::highlighting::{self, FontStyle}; use syntect::highlighting::{self, FontStyle};
/// Approximate a 24 bit color value by a 8 bit ANSI code /// 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( pub fn as_terminal_escaped(
style: highlighting::Style, style: highlighting::Style,
text: &str, text: &str,
@ -29,12 +38,7 @@ pub fn as_terminal_escaped(
let style = if !colored { let style = if !colored {
Style::default() Style::default()
} else { } else {
let color = if true_color { let color = to_ansi_color(style.foreground, 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)
};
if style.font_style.contains(FontStyle::BOLD) { if style.font_style.contains(FontStyle::BOLD) {
color.bold() color.bold()