WIP: Add nushell support

Mikayla created

Change summary

Cargo.lock                                            | 10 ++
Cargo.toml                                            |  1 
crates/live_kit_client/LiveKitBridge/Package.resolved |  4 
crates/zed/Cargo.toml                                 |  1 
crates/zed/src/languages.rs                           |  1 
crates/zed/src/languages/nushell.rs                   |  0 
crates/zed/src/languages/nushell/config.toml          |  9 +
crates/zed/src/languages/nushell/highlights.scm       | 61 +++++++++++++
8 files changed, 85 insertions(+), 2 deletions(-)

Detailed changes

Cargo.lock 🔗

@@ -8406,6 +8406,15 @@ dependencies = [
  "tree-sitter",
 ]
 
+[[package]]
+name = "tree-sitter-nu"
+version = "0.0.1"
+source = "git+https://github.com/mikayla-maki/tree-sitter-nu/?rev=6cf9ee39ceb3da79501de7646b10e5e1da800ab8#6cf9ee39ceb3da79501de7646b10e5e1da800ab8"
+dependencies = [
+ "cc",
+ "tree-sitter",
+]
+
 [[package]]
 name = "tree-sitter-php"
 version = "0.19.1"
@@ -9868,6 +9877,7 @@ dependencies = [
  "tree-sitter-lua",
  "tree-sitter-markdown",
  "tree-sitter-nix",
+ "tree-sitter-nu",
  "tree-sitter-php",
  "tree-sitter-python",
  "tree-sitter-racket",

Cargo.toml 🔗

@@ -141,6 +141,7 @@ tree-sitter-racket = { git = "https://github.com/zed-industries/tree-sitter-rack
 tree-sitter-yaml = { git = "https://github.com/zed-industries/tree-sitter-yaml", rev = "f545a41f57502e1b5ddf2a6668896c1b0620f930"}
 tree-sitter-lua = "0.0.14"
 tree-sitter-nix = { git = "https://github.com/nix-community/tree-sitter-nix", rev = "66e3e9ce9180ae08fc57372061006ef83f0abde7" }
+tree-sitter-nu = { git = "https://github.com/mikayla-maki/tree-sitter-nu/", rev = "6cf9ee39ceb3da79501de7646b10e5e1da800ab8"}
 
 [patch.crates-io]
 tree-sitter = { git = "https://github.com/tree-sitter/tree-sitter", rev = "35a6052fbcafc5e5fc0f9415b8652be7dcaf7222" }

crates/live_kit_client/LiveKitBridge/Package.resolved 🔗

@@ -42,8 +42,8 @@
         "repositoryURL": "https://github.com/apple/swift-protobuf.git",
         "state": {
           "branch": null,
-          "revision": "0af9125c4eae12a4973fb66574c53a54962a9e1e",
-          "version": "1.21.0"
+          "revision": "ce20dc083ee485524b802669890291c0d8090170",
+          "version": "1.22.1"
         }
       }
     ]

crates/zed/Cargo.toml 🔗

@@ -132,6 +132,7 @@ tree-sitter-racket.workspace = true
 tree-sitter-yaml.workspace = true
 tree-sitter-lua.workspace = true
 tree-sitter-nix.workspace = true
+tree-sitter-nu.workspace = true
 
 url = "2.2"
 urlencoding = "2.1.2"

crates/zed/src/languages.rs 🔗

@@ -170,6 +170,7 @@ pub fn init(languages: Arc<LanguageRegistry>, node_runtime: Arc<dyn NodeRuntime>
     language("elm", tree_sitter_elm::language(), vec![]);
     language("glsl", tree_sitter_glsl::language(), vec![]);
     language("nix", tree_sitter_nix::language(), vec![]);
+    language("nu", tree_sitter_nu::language(), vec![]);
 }
 
 #[cfg(any(test, feature = "test-support"))]

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

@@ -0,0 +1,9 @@
+name = "Nu"
+path_suffixes = ["nu"]
+line_comment = "# "
+autoclose_before = ";:.,=}])>` \n\t\""
+brackets = [
+    { start = "{", end = "}", close = true, newline = true },
+    { start = "[", end = "]", close = true, newline = true },
+    { start = "(", end = ")", close = true, newline = true },
+]

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

@@ -0,0 +1,61 @@
+(string) @string
+(type) @type
+(value_path) @variable
+(comment) @comment
+
+(number_literal) @number
+(range from: (number_literal) @number)
+(range to: (number_literal) @number)
+
+(command cmd_name: (identifier) @function)
+(function_definition func_name: (identifier) @function)
+
+[
+    (variable_declaration name: (identifier))
+    (parameter (identifier))
+    (flag (flag_name))
+    (flag (flag_shorthand_name))
+    (record_entry entry_name: (identifier))
+    (block_args block_param: (identifier))
+] @property
+; (parameter (identifier) @variable.parameter) ; -- alternative highlighting group?
+
+(cmd_invocation) @embedded
+
+
+((identifier) @constant
+ (.match? @constant "^[A-Z][A-Z\\d_]*$"))
+
+[
+ "if"
+ "else"
+ "not"
+ "let"
+ "def"
+ "def-env"
+ "export"
+ "true"
+ "false"
+ "and"
+ "or"
+] @keyword
+
+[
+  ; "/" Not making / an operator may lead to better highlighting?
+  "$"
+  "|"
+  "+"
+  "-"
+  "*"
+  "="
+  "!="
+  "and"
+  "or"
+  "=="
+  ">"
+] @operator
+
+["."
+ ","
+ ";"
+] @delimiter