Repository: wezterm/wezterm (language: rust)

Issue:
Disable terminal colors temporarily in quick select mode
It is a bit too noisy with colors on when trying to select something. Kitty by default turns colors all off in quick select.

Of course it is possible to write my own function to turn off colors, do quick select, and turn it back on, but it would much easier if there is an option to just turn off colors in quick select mode.


Discussion / hints:

Fix patch:
diff --git a/Cargo.lock b/Cargo.lock
index 4e7128bd790..36e05f2265a 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 6c93b480559..21522f4a3de 100644
--- a/config/src/config.rs
+++ b/config/src/config.rs
@@ -420,6 +420,8 @@ pub struct Config {
     pub quick_select_patterns: Vec<String>,
     #[dynamic(default = "default_alphabet")]
     pub quick_select_alphabet: String,
+    #[dynamic(default)]
+    pub quick_select_remove_styling: bool,
 
     #[dynamic(default)]
     pub mouse_bindings: Vec<Mouse>,
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 00000000000..c0b373db092
--- /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 ee76b8739a8..5b1219183f1 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 51a38f05823..56e61049295 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 de783b22a61..f9bab423480 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 728850cd3f2..428fa4666bf 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 {


Test patch: