Merge pull request #1858 from zed-industries/add-lisp

Mikayla Maki created

Added tree sitter support for scheme and racket

Change summary

Cargo.lock                                     | 20 +++++++++++
crates/zed/Cargo.toml                          |  2 +
crates/zed/src/languages.rs                    |  3 +
crates/zed/src/languages/racket/brackets.scm   |  3 +
crates/zed/src/languages/racket/config.toml    |  9 +++++
crates/zed/src/languages/racket/highlights.scm | 34 ++++++++++++++++++++
crates/zed/src/languages/racket/indents.scm    |  3 +
crates/zed/src/languages/racket/outline.scm    | 10 +++++
crates/zed/src/languages/ruby/brackets.scm     |  2 
crates/zed/src/languages/scheme/brackets.scm   |  3 +
crates/zed/src/languages/scheme/config.toml    |  9 +++++
crates/zed/src/languages/scheme/highlights.scm | 28 ++++++++++++++++
crates/zed/src/languages/scheme/indents.scm    |  3 +
crates/zed/src/languages/scheme/outline.scm    | 10 +++++
14 files changed, 138 insertions(+), 1 deletion(-)

Detailed changes

Cargo.lock 🔗

@@ -6566,6 +6566,15 @@ dependencies = [
  "tree-sitter",
 ]
 
+[[package]]
+name = "tree-sitter-racket"
+version = "0.0.1"
+source = "git+https://github.com/zed-industries/tree-sitter-racket?rev=eb010cf2c674c6fd9a6316a84e28ef90190fe51a#eb010cf2c674c6fd9a6316a84e28ef90190fe51a"
+dependencies = [
+ "cc",
+ "tree-sitter",
+]
+
 [[package]]
 name = "tree-sitter-ruby"
 version = "0.20.0"
@@ -6586,6 +6595,15 @@ dependencies = [
  "tree-sitter",
 ]
 
+[[package]]
+name = "tree-sitter-scheme"
+version = "0.2.0"
+source = "git+https://github.com/6cdh/tree-sitter-scheme?rev=af0fd1fa452cb2562dc7b5c8a8c55551c39273b9#af0fd1fa452cb2562dc7b5c8a8c55551c39273b9"
+dependencies = [
+ "cc",
+ "tree-sitter",
+]
+
 [[package]]
 name = "tree-sitter-toml"
 version = "0.5.1"
@@ -7805,8 +7823,10 @@ dependencies = [
  "tree-sitter-json 0.20.0",
  "tree-sitter-markdown",
  "tree-sitter-python",
+ "tree-sitter-racket",
  "tree-sitter-ruby",
  "tree-sitter-rust",
+ "tree-sitter-scheme",
  "tree-sitter-toml",
  "tree-sitter-typescript",
  "unindent",

crates/zed/Cargo.toml 🔗

@@ -104,6 +104,8 @@ tree-sitter-toml = { git = "https://github.com/tree-sitter/tree-sitter-toml", re
 tree-sitter-typescript = "0.20.1"
 tree-sitter-ruby = "0.20.0"
 tree-sitter-html = "0.19.0"
+tree-sitter-scheme = { git = "https://github.com/6cdh/tree-sitter-scheme", rev = "af0fd1fa452cb2562dc7b5c8a8c55551c39273b9"}
+tree-sitter-racket = { git = "https://github.com/zed-industries/tree-sitter-racket", rev = "eb010cf2c674c6fd9a6316a84e28ef90190fe51a"}
 url = "2.2"
 
 [dev-dependencies]

crates/zed/src/languages.rs 🔗

@@ -14,6 +14,7 @@ mod language_plugin;
 mod python;
 mod ruby;
 mod rust;
+
 mod typescript;
 
 // 1. Add tree-sitter-{language} parser to zed crate
@@ -127,6 +128,8 @@ pub async fn init(languages: Arc<LanguageRegistry>, _executor: Arc<Background>)
             tree_sitter_embedded_template::language(),
             Some(CachedLspAdapter::new(ruby::RubyLanguageServer).await),
         ),
+        ("scheme", tree_sitter_scheme::language(), None),
+        ("racket", tree_sitter_racket::language(), None),
     ] {
         languages.add(language(name, grammar, lsp_adapter));
     }

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

@@ -0,0 +1,9 @@
+name = "Racket"
+path_suffixes = ["rkt"]
+line_comment = "; "
+autoclose_before = "])"
+brackets = [
+    { start = "[", end = "]", close = true, newline = false },
+    { start = "(", end = ")", close = true, newline = false },
+    { start = "\"", end = "\"", close = true, newline = false },
+]

crates/zed/src/languages/racket/highlights.scm 🔗

@@ -0,0 +1,40 @@
+["(" ")" "[" "]" "{" "}"] @punctuation.bracket
+
+[(string)
+ (here_string)
+ (byte_string)] @string
+(regex) @string.special
+(escape_sequence) @escape
+
+[(comment)
+ (block_comment)
+ (sexp_comment)] @comment
+
+(symbol) @variable
+
+(number) @number
+(character) @constant.builtin
+(boolean) @constant.builtin
+(keyword) @constant
+(quote . (symbol)) @constant
+
+(extension) @keyword
+(lang_name) @variable.builtin
+
+((symbol) @operator
+ (#match? @operator "^(\\+|-|\\*|/|=|>|<|>=|<=)$"))
+
+(list
+  .
+  (symbol) @function)
+
+(list
+  .
+  (symbol) @keyword
+  (#match? @keyword

crates/zed/src/languages/ruby/brackets.scm 🔗

@@ -11,4 +11,4 @@
 (begin "begin" @open "end" @close)
 (module "module" @open "end" @close)
 (_ . "def" @open "end" @close)
-(_ . "class" @open "end" @close)
+(_ . "class" @open "end" @close)

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

@@ -0,0 +1,9 @@
+name = "Scheme"
+path_suffixes = ["scm", "ss"]
+line_comment = "; "
+autoclose_before = "])"
+brackets = [
+    { start = "[", end = "]", close = true, newline = false },
+    { start = "(", end = ")", close = true, newline = false },
+    { start = "\"", end = "\"", close = true, newline = false },
+]

crates/zed/src/languages/scheme/highlights.scm 🔗

@@ -0,0 +1,28 @@
+["(" ")" "[" "]" "{" "}"] @punctuation.bracket
+
+(number) @number
+(character) @constant.builtin
+(boolean) @constant.builtin
+
+(symbol) @variable
+(string) @string
+
+(escape_sequence) @escape
+
+[(comment)
+ (block_comment)
+ (directive)] @comment
+
+((symbol) @operator
+ (#match? @operator "^(\\+|-|\\*|/|=|>|<|>=|<=)$"))
+
+(list
+  .
+  (symbol) @function)
+
+(list
+  .
+  (symbol) @keyword
+  (#match? @keyword
+   "^(define-syntax|let\\*|lambda|λ|case|=>|quote-splicing|unquote-splicing|set!|let|letrec|letrec-syntax|let-values|let\\*-values|do|else|define|cond|syntax-rules|unquote|begin|quote|let-syntax|and|if|quasiquote|letrec|delay|or|when|unless|identifier-syntax|assert|library|export|import|rename|only|except|prefix)$"
+   ))