diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 1c3ac8eb7571dc5eeda601336e88e735cc460246..bcde3329be395d967e1b2887d67529a47a226476 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -2916,7 +2916,7 @@ impl Editor { } if let Some(bracket_pair) = bracket_pair { - let snapshot_settings = snapshot.settings_at(selection.start, cx); + let snapshot_settings = snapshot.language_settings_at(selection.start, cx); let autoclose = self.use_autoclose && snapshot_settings.use_autoclose; let auto_surround = self.use_auto_surround && snapshot_settings.use_auto_surround; @@ -2981,7 +2981,7 @@ impl Editor { } let always_treat_brackets_as_autoclosed = snapshot - .settings_at(selection.start, cx) + .language_settings_at(selection.start, cx) .always_treat_brackets_as_autoclosed; if always_treat_brackets_as_autoclosed && is_bracket_pair_end @@ -3264,7 +3264,7 @@ impl Editor { return None; } - if !multi_buffer.settings_at(0, cx).extend_comment_on_newline { + if !multi_buffer.language_settings(cx).extend_comment_on_newline { return None; } @@ -3593,7 +3593,7 @@ impl Editor { } let always_treat_brackets_as_autoclosed = buffer - .settings_at(selection.start, cx) + .language_settings_at(selection.start, cx) .always_treat_brackets_as_autoclosed; if !always_treat_brackets_as_autoclosed { @@ -7292,7 +7292,7 @@ impl Editor { } // Otherwise, insert a hard or soft tab. - let settings = buffer.settings_at(cursor, cx); + let settings = buffer.language_settings_at(cursor, cx); let tab_size = if settings.hard_tabs { IndentSize::tab() } else { @@ -7356,7 +7356,7 @@ impl Editor { delta_for_start_row: u32, cx: &App, ) -> u32 { - let settings = buffer.settings_at(selection.start, cx); + let settings = buffer.language_settings_at(selection.start, cx); let tab_size = settings.tab_size.get(); let indent_kind = if settings.hard_tabs { IndentKind::Tab @@ -7436,7 +7436,7 @@ impl Editor { let buffer = self.buffer.read(cx); let snapshot = buffer.snapshot(cx); for selection in &selections { - let settings = buffer.settings_at(selection.start, cx); + let settings = buffer.language_settings_at(selection.start, cx); let tab_size = settings.tab_size.get(); let mut rows = selection.spanned_rows(false, &display_map); @@ -8451,7 +8451,7 @@ impl Editor { continue; } - let tab_size = buffer.settings_at(selection.head(), cx).tab_size; + let tab_size = buffer.language_settings_at(selection.head(), cx).tab_size; // Since not all lines in the selection may be at the same indent // level, choose the indent size that is the most common between all @@ -8497,7 +8497,7 @@ impl Editor { inside_comment = true; } - let language_settings = buffer.settings_at(selection.head(), cx); + let language_settings = buffer.language_settings_at(selection.head(), cx); let allow_rewrap_based_on_language = match language_settings.allow_rewrap { RewrapBehavior::InComments => inside_comment, RewrapBehavior::InSelections => !selection.is_empty(), @@ -8553,7 +8553,7 @@ impl Editor { }; let wrap_column = buffer - .settings_at(Point::new(start_row, 0), cx) + .language_settings_at(Point::new(start_row, 0), cx) .preferred_line_length as usize; let wrapped_text = wrap_with_prefix( line_prefix, @@ -8741,8 +8741,9 @@ impl Editor { this.buffer.update(cx, |buffer, cx| { let snapshot = buffer.read(cx); - auto_indent_on_paste = - snapshot.settings_at(cursor_offset, cx).auto_indent_on_paste; + auto_indent_on_paste = snapshot + .language_settings_at(cursor_offset, cx) + .auto_indent_on_paste; let mut start_offset = 0; let mut edits = Vec::new(); @@ -13998,12 +13999,16 @@ impl Editor { return wrap_guides; } - let settings = self.buffer.read(cx).settings_at(0, cx); + let settings = self.buffer.read(cx).language_settings(cx); if settings.show_wrap_guides { - if let SoftWrap::Column(soft_wrap) = self.soft_wrap_mode(cx) { - wrap_guides.push((soft_wrap as usize, true)); - } else if let SoftWrap::Bounded(soft_wrap) = self.soft_wrap_mode(cx) { - wrap_guides.push((soft_wrap as usize, true)); + match self.soft_wrap_mode(cx) { + SoftWrap::Column(soft_wrap) => { + wrap_guides.push((soft_wrap as usize, true)); + } + SoftWrap::Bounded(soft_wrap) => { + wrap_guides.push((soft_wrap as usize, true)); + } + SoftWrap::GitDiff | SoftWrap::None | SoftWrap::EditorWidth => {} } wrap_guides.extend(settings.wrap_guides.iter().map(|guide| (*guide, false))) } @@ -14012,7 +14017,7 @@ impl Editor { } pub fn soft_wrap_mode(&self, cx: &App) -> SoftWrap { - let settings = self.buffer.read(cx).settings_at(0, cx); + let settings = self.buffer.read(cx).language_settings(cx); let mode = self.soft_wrap_mode_override.unwrap_or(settings.soft_wrap); match mode { language_settings::SoftWrap::PreferLine | language_settings::SoftWrap::None => { @@ -14111,7 +14116,7 @@ impl Editor { let currently_enabled = self.should_show_indent_guides().unwrap_or_else(|| { self.buffer .read(cx) - .settings_at(0, cx) + .language_settings(cx) .indent_guides .enabled }); @@ -15755,7 +15760,7 @@ impl Editor { let copilot_enabled_for_language = self .buffer .read(cx) - .settings_at(0, cx) + .language_settings(cx) .show_edit_predictions; let project = project.read(cx); diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 9fc8bf020252e69f51ee1ea94d7fd4320653d2be..3af56f79477e288c40ab1efae024c70443ca1201 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -4712,7 +4712,7 @@ impl EditorElement { .read(cx) .buffer .read(cx) - .settings_at(0, cx) + .language_settings(cx) .show_whitespaces; for (ix, line_with_invisibles) in layout.position_map.line_layouts.iter().enumerate() { diff --git a/crates/multi_buffer/src/multi_buffer.rs b/crates/multi_buffer/src/multi_buffer.rs index 8ef2c6e5b1e27e01283826380674e4bf8123a775..a9c3b7333376f4c483affef310ddce4cf6094e8b 100644 --- a/crates/multi_buffer/src/multi_buffer.rs +++ b/crates/multi_buffer/src/multi_buffer.rs @@ -2337,7 +2337,27 @@ impl MultiBuffer { .and_then(|(buffer, offset)| buffer.read(cx).language_at(offset)) } - pub fn settings_at<'a, T: ToOffset>(&self, point: T, cx: &'a App) -> Cow<'a, LanguageSettings> { + pub fn language_settings<'a>(&'a self, cx: &'a App) -> Cow<'a, LanguageSettings> { + let buffer_id = self + .snapshot + .borrow() + .excerpts + .first() + .map(|excerpt| excerpt.buffer.remote_id()); + buffer_id + .and_then(|buffer_id| self.buffer(buffer_id)) + .map(|buffer| { + let buffer = buffer.read(cx); + language_settings(buffer.language().map(|l| l.name()), buffer.file(), cx) + }) + .unwrap_or_else(move || self.language_settings_at(0, cx)) + } + + pub fn language_settings_at<'a, T: ToOffset>( + &'a self, + point: T, + cx: &'a App, + ) -> Cow<'a, LanguageSettings> { let mut language = None; let mut file = None; if let Some((buffer, offset)) = self.point_to_buffer_offset(point, cx) { @@ -4259,7 +4279,7 @@ impl MultiBufferSnapshot { pub fn indent_and_comment_for_line(&self, row: MultiBufferRow, cx: &App) -> String { let mut indent = self.indent_size_for_line(row).chars().collect::(); - if self.settings_at(0, cx).extend_comment_on_newline { + if self.language_settings(cx).extend_comment_on_newline { if let Some(language_scope) = self.language_scope_at(Point::new(row.0, 0)) { let delimiters = language_scope.line_comment_prefixes(); for delimiter in delimiters { @@ -5592,7 +5612,21 @@ impl MultiBufferSnapshot { .and_then(|(buffer, offset)| buffer.language_at(offset)) } - pub fn settings_at<'a, T: ToOffset>( + fn language_settings<'a>(&'a self, cx: &'a App) -> Cow<'a, LanguageSettings> { + self.excerpts + .first() + .map(|excerpt| &excerpt.buffer) + .map(|buffer| { + language_settings( + buffer.language().map(|language| language.name()), + buffer.file(), + cx, + ) + }) + .unwrap_or_else(move || self.language_settings_at(0, cx)) + } + + pub fn language_settings_at<'a, T: ToOffset>( &'a self, point: T, cx: &'a App, diff --git a/crates/vim/src/normal/paste.rs b/crates/vim/src/normal/paste.rs index 35f468a81363d8d72d2d8a36e14be013815857ea..7dd5c93de326c72e8e8a954bcd7bd08e4a598ebe 100644 --- a/crates/vim/src/normal/paste.rs +++ b/crates/vim/src/normal/paste.rs @@ -160,7 +160,7 @@ impl Vim { .buffer() .read(cx) .snapshot(cx) - .settings_at(cursor_offset, cx) + .language_settings_at(cursor_offset, cx) .auto_indent_on_paste { editor.edit_with_block_indent(edits, original_indent_columns, cx);