diff options
author | Christian Duerr <contact@christianduerr.com> | 2020-07-09 21:45:22 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-09 21:45:22 +0000 |
commit | 46c0f352c40ecb68653421cb178a297acaf00c6d (patch) | |
tree | 3e1985f8237f7c8268703634f8c8ccb25f7823a5 /alacritty_terminal/src/config | |
parent | 9974bc8baa45fda0b4ba3db2ae615fb7f90f7029 (diff) | |
download | alacritty-46c0f352c40ecb68653421cb178a297acaf00c6d.tar.gz alacritty-46c0f352c40ecb68653421cb178a297acaf00c6d.zip |
Add regex scrollback buffer search
This adds a new regex search which allows searching the entire
scrollback and jumping between matches using the vi mode.
All visible matches should be highlighted unless their lines are
excessively long. This should help with performance since highlighting
is done during render time.
Fixes #1017.
Diffstat (limited to 'alacritty_terminal/src/config')
-rw-r--r-- | alacritty_terminal/src/config/colors.rs | 124 | ||||
-rw-r--r-- | alacritty_terminal/src/config/mod.rs | 27 |
2 files changed, 106 insertions, 45 deletions
diff --git a/alacritty_terminal/src/config/colors.rs b/alacritty_terminal/src/config/colors.rs index ccea9536..13a30bef 100644 --- a/alacritty_terminal/src/config/colors.rs +++ b/alacritty_terminal/src/config/colors.rs @@ -1,8 +1,9 @@ use log::error; use serde::{Deserialize, Deserializer}; +use serde_yaml::Value; use crate::config::{failure_default, LOG_TARGET_CONFIG}; -use crate::term::color::Rgb; +use crate::term::color::{CellRgb, Rgb}; #[serde(default)] #[derive(Deserialize, Clone, Debug, Default, PartialEq, Eq)] @@ -23,6 +24,8 @@ pub struct Colors { pub dim: Option<AnsiColors>, #[serde(deserialize_with = "failure_default")] pub indexed_colors: Vec<IndexedColor>, + #[serde(deserialize_with = "failure_default")] + pub search: SearchColors, } impl Colors { @@ -33,6 +36,32 @@ impl Colors { pub fn bright(&self) -> &AnsiColors { &self.bright.0 } + + pub fn search_bar_foreground(&self) -> Rgb { + self.search.bar.foreground.unwrap_or(self.primary.background) + } + + pub fn search_bar_background(&self) -> Rgb { + self.search.bar.background.unwrap_or(self.primary.foreground) + } +} + +#[derive(Deserialize, Copy, Clone, Debug, PartialEq, Eq)] +struct DefaultForegroundCellRgb(CellRgb); + +impl Default for DefaultForegroundCellRgb { + fn default() -> Self { + Self(CellRgb::CellForeground) + } +} + +#[derive(Deserialize, Copy, Clone, Debug, PartialEq, Eq)] +struct DefaultBackgroundCellRgb(CellRgb); + +impl Default for DefaultBackgroundCellRgb { + fn default() -> Self { + Self(CellRgb::CellBackground) + } } #[serde(default)] @@ -44,11 +73,11 @@ pub struct IndexedColor { pub color: Rgb, } -fn deserialize_color_index<'a, D>(deserializer: D) -> ::std::result::Result<u8, D::Error> +fn deserialize_color_index<'a, D>(deserializer: D) -> Result<u8, D::Error> where D: Deserializer<'a>, { - let value = serde_yaml::Value::deserialize(deserializer)?; + let value = Value::deserialize(deserializer)?; match u8::deserialize(value) { Ok(index) => { if index < 16 { @@ -78,26 +107,91 @@ where #[derive(Deserialize, Debug, Copy, Clone, Default, PartialEq, Eq)] pub struct CursorColors { #[serde(deserialize_with = "failure_default")] - pub text: Option<Rgb>, + text: DefaultBackgroundCellRgb, #[serde(deserialize_with = "failure_default")] - pub cursor: Option<Rgb>, + cursor: DefaultForegroundCellRgb, +} + +impl CursorColors { + pub fn text(self) -> CellRgb { + self.text.0 + } + + pub fn cursor(self) -> CellRgb { + self.cursor.0 + } } #[serde(default)] #[derive(Deserialize, Debug, Copy, Clone, Default, PartialEq, Eq)] pub struct SelectionColors { #[serde(deserialize_with = "failure_default")] - pub text: Option<Rgb>, + text: DefaultBackgroundCellRgb, + #[serde(deserialize_with = "failure_default")] + background: DefaultForegroundCellRgb, +} + +impl SelectionColors { + pub fn text(self) -> CellRgb { + self.text.0 + } + + pub fn background(self) -> CellRgb { + self.background.0 + } +} + +#[serde(default)] +#[derive(Deserialize, Debug, Copy, Clone, Default, PartialEq, Eq)] +pub struct SearchColors { + #[serde(deserialize_with = "failure_default")] + pub matches: MatchColors, #[serde(deserialize_with = "failure_default")] - pub background: Option<Rgb>, + bar: BarColors, +} + +#[serde(default)] +#[derive(Deserialize, Debug, Copy, Clone, PartialEq, Eq)] +pub struct MatchColors { + #[serde(deserialize_with = "failure_default")] + pub foreground: CellRgb, + #[serde(deserialize_with = "deserialize_match_background")] + pub background: CellRgb, +} + +impl Default for MatchColors { + fn default() -> Self { + Self { foreground: CellRgb::default(), background: default_match_background() } + } +} + +fn deserialize_match_background<'a, D>(deserializer: D) -> Result<CellRgb, D::Error> +where + D: Deserializer<'a>, +{ + let value = Value::deserialize(deserializer)?; + Ok(CellRgb::deserialize(value).unwrap_or_else(|_| default_match_background())) +} + +fn default_match_background() -> CellRgb { + CellRgb::Rgb(Rgb { r: 0xff, g: 0xff, b: 0xff }) +} + +#[serde(default)] +#[derive(Deserialize, Debug, Copy, Clone, Default, PartialEq, Eq)] +pub struct BarColors { + #[serde(deserialize_with = "failure_default")] + foreground: Option<Rgb>, + #[serde(deserialize_with = "failure_default")] + background: Option<Rgb>, } #[serde(default)] #[derive(Deserialize, Clone, Debug, PartialEq, Eq)] pub struct PrimaryColors { - #[serde(default = "default_background", deserialize_with = "failure_default")] + #[serde(deserialize_with = "failure_default")] pub background: Rgb, - #[serde(default = "default_foreground", deserialize_with = "failure_default")] + #[serde(deserialize_with = "failure_default")] pub foreground: Rgb, #[serde(deserialize_with = "failure_default")] pub bright_foreground: Option<Rgb>, @@ -108,22 +202,14 @@ pub struct PrimaryColors { impl Default for PrimaryColors { fn default() -> Self { PrimaryColors { - background: default_background(), - foreground: default_foreground(), + background: Rgb { r: 0x1d, g: 0x1f, b: 0x21 }, + foreground: Rgb { r: 0xc5, g: 0xc8, b: 0xc6 }, bright_foreground: Default::default(), dim_foreground: Default::default(), } } } -fn default_background() -> Rgb { - Rgb { r: 0x1d, g: 0x1f, b: 0x21 } -} - -fn default_foreground() -> Rgb { - Rgb { r: 0xc5, g: 0xc8, b: 0xc6 } -} - /// The 8-colors sections of config. #[derive(Deserialize, Clone, Debug, PartialEq, Eq)] pub struct AnsiColors { diff --git a/alacritty_terminal/src/config/mod.rs b/alacritty_terminal/src/config/mod.rs index c3936c0c..e3d72fda 100644 --- a/alacritty_terminal/src/config/mod.rs +++ b/alacritty_terminal/src/config/mod.rs @@ -13,7 +13,7 @@ mod scrolling; mod visual_bell; mod window; -use crate::ansi::{CursorStyle, NamedColor}; +use crate::ansi::CursorStyle; pub use crate::config::colors::Colors; pub use crate::config::debug::Debug; @@ -21,7 +21,6 @@ pub use crate::config::font::{Font, FontDescription}; pub use crate::config::scrolling::Scrolling; pub use crate::config::visual_bell::{VisualBellAnimation, VisualBellConfig}; pub use crate::config::window::{Decorations, Dimensions, StartupMode, WindowConfig, DEFAULT_NAME}; -use crate::term::color::Rgb; pub const LOG_TARGET_CONFIG: &str = "alacritty_config"; const MAX_SCROLLBACK_LINES: u32 = 100_000; @@ -156,30 +155,6 @@ impl<T> Config<T> { self.dynamic_title.0 } - /// Cursor foreground color. - #[inline] - pub fn cursor_text_color(&self) -> Option<Rgb> { - self.colors.cursor.text - } - - /// Cursor background color. - #[inline] - pub fn cursor_cursor_color(&self) -> Option<NamedColor> { - self.colors.cursor.cursor.map(|_| NamedColor::Cursor) - } - - /// Vi mode cursor foreground color. - #[inline] - pub fn vi_mode_cursor_text_color(&self) -> Option<Rgb> { - self.colors.vi_mode_cursor.text - } - - /// Vi mode cursor background color. - #[inline] - pub fn vi_mode_cursor_cursor_color(&self) -> Option<Rgb> { - self.colors.vi_mode_cursor.cursor - } - #[inline] pub fn set_dynamic_title(&mut self, dynamic_title: bool) { self.dynamic_title.0 = dynamic_title; |