diff options
-rw-r--r-- | manifest.json | 7 | ||||
-rw-r--r-- | plugins/language_nix.lua | 87 |
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, +} |