Fix removal of brackets inserted by auto-close when using snippets (#7265)
Hans
and
Thorsten Ball
created 2 years ago
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 <mrnugget@gmail.com>
Change summary
crates/editor/src/editor.rs | 37 ++++++++++++++++++++++++++++++++++++-
1 file changed, 36 insertions(+), 1 deletion(-)
Detailed changes
@@ -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::<Point>(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::<String>();
+ let prev_chars = snapshot
+ .reversed_chars_at(selection_head)
+ .collect::<String>();
+ 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(())
}