Merge pull request #1208 from zed-industries/enhance-autoclose

Antonio Scandurra created

Enhance auto-closing bracket behavior

Change summary

crates/editor/src/editor.rs                     | 52 +++++++++++++++++-
crates/zed/src/languages/javascript/config.toml |  2 
crates/zed/src/languages/markdown/config.toml   |  3 +
crates/zed/src/languages/rust/config.toml       |  1 
crates/zed/src/languages/tsx/config.toml        |  2 
crates/zed/src/languages/typescript/config.toml |  2 
6 files changed, 58 insertions(+), 4 deletions(-)

Detailed changes

crates/editor/src/editor.rs 🔗

@@ -2005,10 +2005,11 @@ impl Editor {
             let autoclose_pair = snapshot.language().and_then(|language| {
                 let first_selection_start = selections.first().unwrap().start;
                 let pair = language.brackets().iter().find(|pair| {
-                    snapshot.contains_str_at(
-                        first_selection_start.saturating_sub(pair.start.len()),
-                        &pair.start,
-                    )
+                    pair.close
+                        && snapshot.contains_str_at(
+                            first_selection_start.saturating_sub(pair.start.len()),
+                            &pair.start,
+                        )
                 });
                 pair.and_then(|pair| {
                     let should_autoclose = selections.iter().all(|selection| {
@@ -8719,6 +8720,12 @@ mod tests {
                         close: true,
                         newline: true,
                     },
+                    BracketPair {
+                        start: "[".to_string(),
+                        end: "]".to_string(),
+                        close: false,
+                        newline: true,
+                    },
                 ],
                 autoclose_before: "})]".to_string(),
                 ..Default::default()
@@ -8847,6 +8854,43 @@ mod tests {
                 view.selections.display_ranges(cx),
                 [DisplayPoint::new(0, 1)..DisplayPoint::new(0, 2)]
             );
+
+            view.undo(&Undo, cx);
+            view.handle_input(&Input("[".to_string()), cx);
+            assert_eq!(
+                view.text(cx),
+                "
+                [a]
+                
+                /*
+                *
+                "
+                .unindent()
+            );
+            assert_eq!(
+                view.selections.display_ranges(cx),
+                [DisplayPoint::new(0, 1)..DisplayPoint::new(0, 2)]
+            );
+
+            view.undo(&Undo, cx);
+            view.change_selections(None, cx, |s| {
+                s.select_display_ranges([DisplayPoint::new(0, 1)..DisplayPoint::new(0, 1)])
+            });
+            view.handle_input(&Input("[".to_string()), cx);
+            assert_eq!(
+                view.text(cx),
+                "
+                a[
+                
+                /*
+                *
+                "
+                .unindent()
+            );
+            assert_eq!(
+                view.selections.display_ranges(cx),
+                [DisplayPoint::new(0, 2)..DisplayPoint::new(0, 2)]
+            );
         });
     }
 

crates/zed/src/languages/javascript/config.toml 🔗

@@ -8,5 +8,7 @@ brackets = [
     { start = "(", end = ")", close = true, newline = true },
     { start = "<", end = ">", close = false, newline = true },
     { start = "\"", end = "\"", close = true, newline = false },
+    { start = "'", end = "'", close = true, newline = false },
+    { start = "`", end = "`", close = true, newline = false },
     { start = "/*", end = " */", close = true, newline = false },
 ]

crates/zed/src/languages/markdown/config.toml 🔗

@@ -5,4 +5,7 @@ brackets = [
     { start = "[", end = "]", close = true, newline = true },
     { start = "(", end = ")", close = true, newline = true },
     { start = "<", end = ">", close = true, newline = true },
+    { start = "\"", end = "\"", close = false, newline = false },
+    { start = "'", end = "'", close = false, newline = false },
+    { start = "`", end = "`", close = false, newline = false },
 ]

crates/zed/src/languages/rust/config.toml 🔗

@@ -8,5 +8,6 @@ brackets = [
     { start = "(", end = ")", close = true, newline = true },
     { start = "<", end = ">", close = false, newline = true },
     { start = "\"", end = "\"", close = true, newline = false },
+    { start = "'", end = "'", close = false, newline = false },
     { start = "/*", end = " */", close = true, newline = false },
 ]

crates/zed/src/languages/tsx/config.toml 🔗

@@ -8,5 +8,7 @@ brackets = [
     { start = "(", end = ")", close = true, newline = true },
     { start = "<", end = ">", close = false, newline = true },
     { start = "\"", end = "\"", close = true, newline = false },
+    { start = "'", end = "'", close = true, newline = false },
+    { start = "`", end = "`", close = true, newline = false },
     { start = "/*", end = " */", close = true, newline = false },
 ]

crates/zed/src/languages/typescript/config.toml 🔗

@@ -8,5 +8,7 @@ brackets = [
     { start = "(", end = ")", close = true, newline = true },
     { start = "<", end = ">", close = false, newline = true },
     { start = "\"", end = "\"", close = true, newline = false },
+    { start = "'", end = "'", close = true, newline = false },
+    { start = "`", end = "`", close = true, newline = false },
     { start = "/*", end = " */", close = true, newline = false },
 ]