From 3c626f3758fde66013074ff226ed2e2c89383800 Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Wed, 24 Sep 2025 16:18:00 -0600 Subject: [PATCH] Only allow single chars for whitespace map (#38825) Release Notes: - Only allow single characters in the whitespace map --- crates/editor/src/element.rs | 4 ++-- crates/language/src/language_settings.rs | 17 +++++++++++--- crates/settings/src/merge_from.rs | 1 + .../settings/src/settings_content/language.rs | 22 ++++--------------- 4 files changed, 21 insertions(+), 23 deletions(-) diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 72b84b4599b681088b6cc4aa5afd705d8af229f8..65da1d76b78b9099073a9abd655a7f54608bd848 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -9324,7 +9324,7 @@ impl Element for EditorElement { .language_settings(cx) .whitespace_map; - let tab_char = whitespace_map.tab(); + let tab_char = whitespace_map.tab.clone(); let tab_len = tab_char.len(); let tab_invisible = window.text_system().shape_line( tab_char, @@ -9340,7 +9340,7 @@ impl Element for EditorElement { None, ); - let space_char = whitespace_map.space(); + let space_char = whitespace_map.space.clone(); let space_len = space_char.len(); let space_invisible = window.text_system().shape_line( space_char, diff --git a/crates/language/src/language_settings.rs b/crates/language/src/language_settings.rs index 0e05123033bf92d537eef5eab258db4eac7e7a56..bae356614b56f5017415937dbaccb83723313c9d 100644 --- a/crates/language/src/language_settings.rs +++ b/crates/language/src/language_settings.rs @@ -7,7 +7,7 @@ use ec4rs::{ property::{FinalNewline, IndentSize, IndentStyle, MaxLineLen, TabWidth, TrimTrailingWs}, }; use globset::{Glob, GlobMatcher, GlobSet, GlobSetBuilder}; -use gpui::{App, Modifiers}; +use gpui::{App, Modifiers, SharedString}; use itertools::{Either, Itertools}; pub use settings::{ @@ -59,6 +59,12 @@ pub struct AllLanguageSettings { pub(crate) file_types: FxHashMap, GlobSet>, } +#[derive(Debug, Clone)] +pub struct WhitespaceMap { + pub space: SharedString, + pub tab: SharedString, +} + /// The settings for a particular language. #[derive(Debug, Clone)] pub struct LanguageSettings { @@ -118,7 +124,7 @@ pub struct LanguageSettings { /// Whether to show tabs and spaces in the editor. pub show_whitespaces: settings::ShowWhitespaceSetting, /// Visible characters used to render whitespace when show_whitespaces is enabled. - pub whitespace_map: settings::WhitespaceMap, + pub whitespace_map: WhitespaceMap, /// Whether to start a new line with a comment when a previous line is a comment as well. pub extend_comment_on_newline: bool, /// Inlay hint related settings. @@ -503,6 +509,8 @@ impl settings::Settings for AllLanguageSettings { let prettier = settings.prettier.unwrap(); let indent_guides = settings.indent_guides.unwrap(); let tasks = settings.tasks.unwrap(); + let whitespace_map = settings.whitespace_map.unwrap(); + LanguageSettings { tab_size: settings.tab_size.unwrap(), hard_tabs: settings.hard_tabs.unwrap(), @@ -536,7 +544,10 @@ impl settings::Settings for AllLanguageSettings { show_edit_predictions: settings.show_edit_predictions.unwrap(), edit_predictions_disabled_in: settings.edit_predictions_disabled_in.unwrap(), show_whitespaces: settings.show_whitespaces.unwrap(), - whitespace_map: settings.whitespace_map.unwrap(), + whitespace_map: WhitespaceMap { + space: SharedString::new(whitespace_map.space.to_string()), + tab: SharedString::new(whitespace_map.tab.to_string()), + }, extend_comment_on_newline: settings.extend_comment_on_newline.unwrap(), inlay_hints: InlayHintSettings { enabled: inlay_hints.enabled.unwrap(), diff --git a/crates/settings/src/merge_from.rs b/crates/settings/src/merge_from.rs index c12994786ff5fadb6686c6ab1b93d9700195eb2a..141ae0ce6d2280c390db80d34949c0d62cbffd02 100644 --- a/crates/settings/src/merge_from.rs +++ b/crates/settings/src/merge_from.rs @@ -49,6 +49,7 @@ merge_from_overwrites!( bool, f64, f32, + char, std::num::NonZeroUsize, std::num::NonZeroU32, String, diff --git a/crates/settings/src/settings_content/language.rs b/crates/settings/src/settings_content/language.rs index 24a3de0c3b918e86488c42d9d12fedb8e16081c6..493b3813d3d613eebc3031276a072804fe3b7c55 100644 --- a/crates/settings/src/settings_content/language.rs +++ b/crates/settings/src/settings_content/language.rs @@ -261,7 +261,7 @@ pub struct LanguageSettingsContent { /// Visible characters used to render whitespace when show_whitespaces is enabled. /// /// Default: "•" for spaces, "→" for tabs. - pub whitespace_map: Option, + pub whitespace_map: Option, /// Whether to start a new line with a comment when a previous line is a comment as well. /// /// Default: true @@ -354,23 +354,9 @@ pub enum ShowWhitespaceSetting { #[skip_serializing_none] #[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq)] -pub struct WhitespaceMap { - pub space: Option, - pub tab: Option, -} - -impl WhitespaceMap { - pub fn space(&self) -> SharedString { - self.space - .as_ref() - .map_or_else(|| SharedString::from("•"), |s| SharedString::from(s)) - } - - pub fn tab(&self) -> SharedString { - self.tab - .as_ref() - .map_or_else(|| SharedString::from("→"), |s| SharedString::from(s)) - } +pub struct WhitespaceMapContent { + pub space: char, + pub tab: char, } /// The behavior of `editor::Rewrap`.