diff --git a/Cargo.lock b/Cargo.lock index 4e7128bd7..36e05f226 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5518,7 +5518,7 @@ checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" [[package]] name = "termwiz" -version = "0.23.0" +version = "0.23.1" dependencies = [ "anyhow", "base64 0.22.1", diff --git a/config/src/config.rs b/config/src/config.rs index 6c93b4805..21522f4a3 100644 --- a/config/src/config.rs +++ b/config/src/config.rs @@ -420,6 +420,8 @@ pub struct Config { pub quick_select_patterns: Vec, #[dynamic(default = "default_alphabet")] pub quick_select_alphabet: String, + #[dynamic(default)] + pub quick_select_remove_styling: bool, #[dynamic(default)] pub mouse_bindings: Vec, diff --git a/docs/config/lua/config/quick_select_remove_styling.md b/docs/config/lua/config/quick_select_remove_styling.md new file mode 100644 index 000000000..c0b373db0 --- /dev/null +++ b/docs/config/lua/config/quick_select_remove_styling.md @@ -0,0 +1,13 @@ +--- +tags: + - quick_select +--- +# `quick_select_remove_styling = false` + +{{since('nightly')}} + +When set to `true`, all color and styling is removed from the pane prior to performing matching and highlighting any matching text in quick select mode. + +This can make it easier to focus on the matches, particularly when the pane already had a lot of styling and colors. + +Defaults to `false` diff --git a/docs/quickselect.md b/docs/quickselect.md index ee76b8739..5b1219183 100644 --- a/docs/quickselect.md +++ b/docs/quickselect.md @@ -28,3 +28,13 @@ text, and cancel quick select mode. Pressing `ESCAPE` will cancel quick select mode. ![Screenshot demonstrating the quickselect text highlights](screenshots/wezterm-quick-select.png) + +{{since('nightly')}} + +A configuration option [quick_select_remove_styling](config/lua/config/quick_select_remove_styling.md) +has been added which when set to `true`, results in all color and styling +being removed from the pane prior to performing matching and highlighting +any matching text in quick select mode. + +This can make it easier to focus on the matches, particularly when the pane +already had a lot of styling and colors. diff --git a/termwiz/Cargo.toml b/termwiz/Cargo.toml index 51a38f058..56e610492 100644 --- a/termwiz/Cargo.toml +++ b/termwiz/Cargo.toml @@ -1,7 +1,7 @@ [package] authors = ["Wez Furlong"] name = "termwiz" -version = "0.23.0" +version = "0.23.1" edition = "2018" repository = "https://github.com/wezterm/wezterm" description = "Terminal Wizardry for Unix and Windows" diff --git a/termwiz/src/cell.rs b/termwiz/src/cell.rs index de783b22a..f9bab4234 100644 --- a/termwiz/src/cell.rs +++ b/termwiz/src/cell.rs @@ -375,6 +375,11 @@ impl CellAttributes { self.background.into() } + /// Clear all attributes from a cell + pub fn clear(&mut self) { + *self = Self::blank(); + } + fn allocate_fat_attributes(&mut self) { if self.fat.is_none() { self.fat.replace(Box::new(FatAttributes { diff --git a/wezterm-gui/src/overlay/quickselect.rs b/wezterm-gui/src/overlay/quickselect.rs index 728850cd3..428fa4666 100644 --- a/wezterm-gui/src/overlay/quickselect.rs +++ b/wezterm-gui/src/overlay/quickselect.rs @@ -545,7 +545,9 @@ impl Pane for QuickSelectOverlay { fn with_lines_mut(&mut self, first_row: StableRowIndex, lines: &mut [&mut Line]) { let mut overlay_lines = vec![]; - let colors = self.renderer.config.resolved_palette.clone(); + let config = &self.renderer.config; + let colors = config.resolved_palette.clone(); + let disable_attr = config.quick_select_remove_styling; // Process the lines; for the search row we want to render instead // the search UI. @@ -553,6 +555,12 @@ impl Pane for QuickSelectOverlay { for (idx, line) in lines.iter_mut().enumerate() { let mut line: Line = line.clone(); + if disable_attr { + line.cells_mut_for_attr_changes_only() + .iter_mut() + .for_each(|cell| cell.attrs_mut().clear()); + line.clear_appdata(); + } let stable_idx = idx as StableRowIndex + first_row; self.renderer.dirty_results.remove(stable_idx); if stable_idx == self.search_row { @@ -633,12 +641,18 @@ impl Pane for QuickSelectOverlay { let (top, mut lines) = self.delegate.get_lines(lines); let colors = renderer.config.resolved_palette.clone(); + let disable_attr = renderer.config.quick_select_remove_styling; // Process the lines; for the search row we want to render instead // the search UI. // For rows with search results, we want to highlight the matching ranges let search_row = renderer.compute_search_row(); for (idx, line) in lines.iter_mut().enumerate() { + if disable_attr { + line.cells_mut_for_attr_changes_only() + .iter_mut() + .for_each(|cell| cell.attrs_mut().clear()); + } let stable_idx = idx as StableRowIndex + top; renderer.dirty_results.remove(stable_idx); if stable_idx == search_row {