From aa34e306f78ee4f2aad8fe8b9d14c2ce116e7a8c Mon Sep 17 00:00:00 2001 From: Hans Date: Thu, 22 Feb 2024 17:09:10 +0800 Subject: [PATCH] Fix removal of brackets inserted by auto-close when using snippets (#7265) Release Notes: - Fixed auto-inserted brackets (or quotes) not being removed when they were inserted as part of a snippet. ([#4605](https://github.com/zed-industries/issues/4605)) --------- Co-authored-by: Thorsten Ball --- crates/editor/src/editor.rs | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index f6fc5b4de0..3bf439f5d4 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -4206,8 +4206,43 @@ impl Editor { active_index: 0, ranges: tabstops, }); - } + // Check whether the just-entered snippet ends with an auto-closable bracket. + if self.autoclose_regions.is_empty() { + let snapshot = self.buffer.read(cx).snapshot(cx); + for selection in &mut self.selections.all::(cx) { + let selection_head = selection.head(); + let Some(scope) = snapshot.language_scope_at(selection_head) else { + continue; + }; + + let mut bracket_pair = None; + let next_chars = snapshot.chars_at(selection_head).collect::(); + let prev_chars = snapshot + .reversed_chars_at(selection_head) + .collect::(); + for (pair, enabled) in scope.brackets() { + if enabled + && pair.close + && prev_chars.starts_with(pair.start.as_str()) + && next_chars.starts_with(pair.end.as_str()) + { + bracket_pair = Some(pair.clone()); + break; + } + } + if let Some(pair) = bracket_pair { + let start = snapshot.anchor_after(selection_head); + let end = snapshot.anchor_after(selection_head); + self.autoclose_regions.push(AutocloseRegion { + selection_id: selection.id, + range: start..end, + pair, + }); + } + } + } + } Ok(()) }