mirror of
				https://github.com/sharkdp/bat.git
				synced 2025-10-31 15:12:12 +00:00 
			
		
		
		
	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:
		| @@ -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 { | ||||
|   | ||||
| @@ -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(), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user