From abf90cc274da0a40e479cef5981bbc9da4381abb Mon Sep 17 00:00:00 2001 From: Mustaque Ahmed Date: Tue, 9 Dec 2025 18:27:23 +0530 Subject: [PATCH] language: Add auto-surround for Plain Text, JSON, and JSONC (#42631) **Summary** When users selected text and pressed opening brackets (`(`, `[`, `{`), the text was deleted instead of being wrapped. - Added bracket pairs: `()`, `[]`, `{}`, `""`, `''` with `surround = true` - Added `surround = true` to existing bracket pairs - Added `()` bracket pair **Production Build Fix** (`crates/languages/src/lib.rs`) - Fixed bug where `brackets` config was stripped in non-`load-grammars` builds - Preserved `brackets: config.brackets` in production mode Closes #41186 **Screen recording** https://github.com/user-attachments/assets/22067fe7-d5c4-4a72-a93d-8dbaae640168 Release Notes: - N/A *or* Added/Fixed/Improved ... --------- Co-authored-by: Smit Barmase --- crates/language/src/language.rs | 40 ++++++++++++++++++++++++++ crates/languages/src/json/config.toml | 7 +++-- crates/languages/src/jsonc/config.toml | 7 +++-- 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index 90a55592864a637a2692ffac6e30451827a479ea..a6a76dc70269777eb3acda79bd3fb32865c4b7ee 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -136,6 +136,46 @@ pub static PLAIN_TEXT: LazyLock> = LazyLock::new(|| { path_suffixes: vec!["txt".to_owned()], first_line_pattern: None, }, + brackets: BracketPairConfig { + pairs: vec![ + BracketPair { + start: "(".to_string(), + end: ")".to_string(), + close: true, + surround: true, + newline: false, + }, + BracketPair { + start: "[".to_string(), + end: "]".to_string(), + close: true, + surround: true, + newline: false, + }, + BracketPair { + start: "{".to_string(), + end: "}".to_string(), + close: true, + surround: true, + newline: false, + }, + BracketPair { + start: "\"".to_string(), + end: "\"".to_string(), + close: true, + surround: true, + newline: false, + }, + BracketPair { + start: "'".to_string(), + end: "'".to_string(), + close: true, + surround: true, + newline: false, + }, + ], + disabled_scopes_by_bracket_ix: Default::default(), + }, ..Default::default() }, None, diff --git a/crates/languages/src/json/config.toml b/crates/languages/src/json/config.toml index 8caa46c8a45076557d5f6c897fc1a5ad11ffa6ac..d21412d7bd2ed8f5ce1062728b9418ed891fa260 100644 --- a/crates/languages/src/json/config.toml +++ b/crates/languages/src/json/config.toml @@ -4,9 +4,10 @@ path_suffixes = ["json", "flake.lock"] line_comments = ["// "] autoclose_before = ",]}" brackets = [ - { start = "{", end = "}", close = true, newline = true }, - { start = "[", end = "]", close = true, newline = true }, - { start = "\"", end = "\"", close = true, newline = false, not_in = ["string"] }, + { start = "{", end = "}", close = true, surround = true, newline = true }, + { start = "[", end = "]", close = true, surround = true, newline = true }, + { start = "(", end = ")", close = true, surround = true, newline = false }, + { start = "\"", end = "\"", close = true, surround = true, newline = false, not_in = ["string"] }, ] tab_size = 2 prettier_parser_name = "json" diff --git a/crates/languages/src/jsonc/config.toml b/crates/languages/src/jsonc/config.toml index fb86cb394aaa74ffb6670e9719c0fe892f02a5c1..cb7ad38ec78fbe4a9b04816400375cefa444f055 100644 --- a/crates/languages/src/jsonc/config.toml +++ b/crates/languages/src/jsonc/config.toml @@ -4,9 +4,10 @@ path_suffixes = ["jsonc", "bun.lock", "tsconfig.json", "pyrightconfig.json"] line_comments = ["// "] autoclose_before = ",]}" brackets = [ - { start = "{", end = "}", close = true, newline = true }, - { start = "[", end = "]", close = true, newline = true }, - { start = "\"", end = "\"", close = true, newline = false, not_in = ["string"] }, + { start = "{", end = "}", close = true, surround = true, newline = true }, + { start = "[", end = "]", close = true, surround = true, newline = true }, + { start = "(", end = ")", close = true, surround = true, newline = false }, + { start = "\"", end = "\"", close = true, surround = true, newline = false, not_in = ["string"] }, ] tab_size = 2 prettier_parser_name = "jsonc"