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