aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--manifest.json7
-rw-r--r--plugins/language_nix.lua87
2 files changed, 94 insertions, 0 deletions
diff --git a/manifest.json b/manifest.json
index 98aecb8..71143d1 100644
--- a/manifest.json
+++ b/manifest.json
@@ -588,6 +588,13 @@
"mod_version": "3"
},
{
+ "description": "Syntax for the [Nix](https://nixos.wiki/wiki/Overview_of_the_Nix_Language) expression language",
+ "version": "0.1",
+ "path": "plugins/language_nix.lua",
+ "id": "language_nix",
+ "mod_version": "3"
+ },
+ {
"description": "Syntax for the [Objective C](https://en.wikipedia.org/wiki/Objective-C) programming language",
"version": "0.1",
"path": "plugins/language_objc.lua",
diff --git a/plugins/language_nix.lua b/plugins/language_nix.lua
new file mode 100644
index 0000000..149c2fa
--- /dev/null
+++ b/plugins/language_nix.lua
@@ -0,0 +1,87 @@
+-- mod-version:3
+-- https://nixos.wiki/wiki/Overview_of_the_Nix_Language
+local syntax = require "core.syntax"
+
+local function merge_tables(a, b)
+ for _, v in pairs(b) do
+ table.insert(a, v)
+ end
+end
+
+local default_symbols = {
+ ["import"] = "keyword2",
+ ["with"] = "keyword2",
+ ["builtins"] = "keyword2",
+ ["inherit"] = "keyword2",
+ ["assert"] = "keyword2",
+ ["let"] = "keyword2",
+ ["in"] = "keyword2",
+ ["rec"] = "keyword2",
+ ["if"] = "keyword",
+ ["else"] = "keyword",
+ ["then"] = "keyword",
+ ["true"] = "literal",
+ ["false"] = "literal",
+ ["null"] = "literal",
+}
+
+local default_patterns = {}
+
+local string_interpolation = {
+ { pattern = {"%${", "}"}, type = "keyword2", syntax = {
+ patterns = default_patterns,
+ symbols = default_symbols,
+ }},
+ { pattern = "[%S][%w]*", type = "string" },
+}
+
+merge_tables(default_patterns, {
+ { pattern = "#.*", type = "comment" },
+ { pattern = {"/%*", "%*/"}, type = "comment" },
+ { pattern = "-?%.?%d+", type = "number" },
+
+ -- interpolation
+ { pattern = {"%${", "}"}, type = "keyword2", syntax = {
+ patterns = default_patterns,
+ symbols = default_symbols,
+ }},
+ { pattern = {'"', '"', '\\'}, type = "string", syntax = {
+ patterns = string_interpolation,
+ symbols = {},
+ }},
+ { pattern = {"''", "''"}, type = "string", syntax = {
+ patterns = string_interpolation,
+ symbols = {},
+ }},
+
+ -- operators
+ { pattern = "[%+%-%?!>%*]", type = "operator" },
+ { pattern = "/ ", type = "operator" },
+ { pattern = "< ", type = "operator" },
+ { pattern = "//", type = "operator" },
+ { pattern = "&&", type = "operator" },
+ { pattern = "%->", type = "operator" },
+ { pattern = "||", type = "operator" },
+ { pattern = "==", type = "operator" },
+ { pattern = "!=", type = "operator" },
+ { pattern = ">=", type = "operator" },
+ { pattern = "<=", type = "operator" },
+
+ -- paths (function because its not used otherwise)
+ { pattern = "%.?%.?/[^%s%[%]%(%){};,:]+", type = "function" },
+ { pattern = "~/[^%s%[%]%(%){};,:]+", type = "function" },
+ { pattern = {"<", ">"}, type = "function" },
+
+ -- every other symbol
+ { pattern = "[%a%-%_][%w%-%_]*", type = "symbol" },
+ { pattern = ";%.,:", type = "normal" },
+})
+
+syntax.add {
+ name = "Nix",
+ files = {"%.nix$"},
+ comment = "#",
+ block_comment = {"/*", "*/"},
+ patterns = default_patterns,
+ symbols = default_symbols,
+}