diff --git a/configuration.nix b/configuration.nix index b9e3b8ec..958311b1 100644 --- a/configuration.nix +++ b/configuration.nix @@ -72,6 +72,7 @@ isMaximal: { extensions.crates-nvim.enable = isMaximal; }; toml.enable = isMaximal; + xml.enable = isMaximal; # Language modules that are not as common. assembly.enable = false; @@ -92,9 +93,10 @@ isMaximal: { fsharp.enable = false; just.enable = false; qml.enable = false; - + jinja.enable = false; tailwind.enable = false; svelte.enable = false; + tera.enable = false; # Nim LSP is broken on Darwin and therefore # should be disabled by default. Users may still enable diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 04a6ba17..e31a07e8 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -132,6 +132,9 @@ - Added [sqruff](https://github.com/quarylabs/sqruff) support to `languages.sql` +- Lazy-load `crates.nvim` plugin when using + `vim.languages.rust.extensions.crates-nvim.enable` + - Added [Pyrefly](https://pyrefly.org/) and [zuban](https://zubanls.com/) support to `languages.python` @@ -139,9 +142,14 @@ [Tombi](https://tombi-toml.github.io/tombi/) language server, linter, and formatter. +- Added Jinja support via `languages.jinja` + - Added [hlargs.nvim](https://github.com/m-demare/hlargs.nvim) support as `visuals.hlargs-nvim`. +- Lazy-load `nvim-autopairs` plugin when using + `vim.autopairs.nvim-autopairs.enable` + [Machshev](https://github.com/machshev): - Added `ruff` and `ty` LSP support for Python under `programs.python`. @@ -151,4 +159,17 @@ - Added [Selenen](https://github.com/kampfkarren/selene) for more diagnostics in `languages.lua`. +- Added XML syntax highlighting, LSP support and formatting + +- Added [tera](https://keats.github.io/tera/) language support (syntax + highlighting only). + +- Added [`golangci-lint`](https://golangci-lint.run/) for more diagnostics. + +[vagahbond](https://github.com/vagahbond): [codewindow.nvim]: +https://github.com/gorbit99/codewindow.nvim + +- Add [codewindow.nvim] plugin in `vim.assistant.codewindow` with `enable` and + `setupOpts` + diff --git a/flake.lock b/flake.lock index 1081a12c..0a98f689 100644 --- a/flake.lock +++ b/flake.lock @@ -74,16 +74,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1768875095, - "narHash": "sha256-dYP3DjiL7oIiiq3H65tGIXXIT1Waiadmv93JS0sS+8A=", + "lastModified": 1769461804, + "narHash": "sha256-msG8SU5WsBUfVVa/9RPLaymvi5bI8edTavbIq3vRlhI=", "owner": "nixos", "repo": "nixpkgs", - "rev": "ed142ab1b3a092c4d149245d0c4126a5d7ea00b0", + "rev": "bfc1b8a4574108ceef22f02bafcf6611380c100d", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixpkgs-unstable", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index 4a35cf91..ba817494 100644 --- a/flake.nix +++ b/flake.nix @@ -122,7 +122,7 @@ systems.url = "github:nix-systems/default"; ## Basic Inputs - nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; + nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; flake-parts = { url = "github:hercules-ci/flake-parts"; diff --git a/modules/plugins/autopairs/nvim-autopairs/config.nix b/modules/plugins/autopairs/nvim-autopairs/config.nix index 6566ec28..1a55273a 100644 --- a/modules/plugins/autopairs/nvim-autopairs/config.nix +++ b/modules/plugins/autopairs/nvim-autopairs/config.nix @@ -4,17 +4,14 @@ ... }: let inherit (lib.modules) mkIf; - inherit (lib.nvim.dag) entryAnywhere; - inherit (lib.nvim.lua) toLuaObject; - cfg = config.vim.autopairs.nvim-autopairs; in { config = mkIf cfg.enable { - vim = { - startPlugins = ["nvim-autopairs"]; - pluginRC.autopairs = entryAnywhere '' - require('nvim-autopairs').setup(${toLuaObject cfg.setupOpts}) - ''; + vim.lazy.plugins.nvim-autopairs = { + package = "nvim-autopairs"; + setupModule = "nvim-autopairs"; + setupOpts = cfg.setupOpts; + event = ["InsertEnter"]; }; }; } diff --git a/modules/plugins/languages/default.nix b/modules/plugins/languages/default.nix index 9b0d241b..7cc5bda5 100644 --- a/modules/plugins/languages/default.nix +++ b/modules/plugins/languages/default.nix @@ -19,8 +19,10 @@ in { ./helm.nix ./kotlin.nix ./html.nix + ./tera.nix ./haskell.nix ./java.nix + ./jinja.nix ./json.nix ./lua.nix ./markdown.nix @@ -50,6 +52,7 @@ in { ./yaml.nix ./ruby.nix ./just.nix + ./xml.nix # This is now a hard deprecation. (mkRenamedOptionModule ["vim" "languages" "enableLSP"] ["vim" "lsp" "enable"]) diff --git a/modules/plugins/languages/go.nix b/modules/plugins/languages/go.nix index c51077f9..bfaafd0d 100644 --- a/modules/plugins/languages/go.nix +++ b/modules/plugins/languages/go.nix @@ -10,7 +10,7 @@ inherit (lib.meta) getExe; inherit (lib.generators) mkLuaInline; inherit (lib.types) bool enum package; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; + inherit (lib.nvim.types) mkGrammarOption diagnostics deprecatedSingleOrListOf; inherit (lib.nvim.dag) entryAfter; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -78,6 +78,91 @@ package = pkgs.delve; }; }; + + defaultDiagnosticsProvider = ["golangci-lint"]; + diagnosticsProviders = { + golangci-lint = let + pkg = pkgs.golangci-lint; + in { + package = pkg; + config = { + cmd = getExe pkg; + args = [ + "run" + "--output.json.path=stdout" + "--issues-exit-code=0" + "--show-stats=false" + "--fix=false" + "--path-mode=abs" + # Overwrite values that could be configured and result in unwanted writes + "--output.text.path=" + "--output.tab.path=" + "--output.html.path=" + "--output.checkstyle.path=" + "--output.code-climate.path=" + "--output.junit-xml.path=" + "--output.teamcity.path=" + "--output.sarif.path=" + ]; + parser = mkLuaInline '' + function(output, bufnr) + local SOURCE = "golangci-lint"; + + local function display_tool_error(msg) + return{ + { + bufnr = bufnr, + lnum = 0, + col = 0, + message = string.format("[%s] %s", SOURCE, msg), + severity = vim.diagnostic.severity.ERROR, + source = SOURCE, + }, + } + end + + if output == "" then + return display_tool_error("no output provided") + end + + local ok, decoded = pcall(vim.json.decode, output) + if not ok then + return display_tool_error("failed to parse JSON output") + end + + if not decoded or not decoded.Issues then + return display_tool_error("unexpected output format") + end + + local severity_map = { + error = vim.diagnostic.severity.ERROR, + warning = vim.diagnostic.severity.WARN, + info = vim.diagnostic.severity.INFO, + hint = vim.diagnostic.severity.HINT, + } + local diagnostics = {} + for _, issue in ipairs(decoded.Issues) do + local sev = vim.diagnostic.severity.ERROR + if issue.Severity and issue.Severity ~= "" then + local normalized = issue.Severity:lower() + sev = severity_map[normalized] or vim.diagnostic.severity.ERROR + end + table.insert(diagnostics, { + bufnr = bufnr, + lnum = issue.Pos.Line - 1, + col = issue.Pos.Column - 1, + message = issue.Text, + code = issue.FromLinter, + severity = sev, + source = SOURCE, + }) + end + return diagnostics + end + ''; + }; + }; + }; in { options.vim.languages.go = { enable = mkEnableOption "Go language support"; @@ -134,6 +219,14 @@ in { default = debuggers.${cfg.dap.debugger}.package; }; }; + extraDiagnostics = { + enable = mkEnableOption "extra Go diagnostics" // {default = config.vim.languages.enableExtraDiagnostics;}; + types = diagnostics { + langDesc = "Go"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; + }; + }; }; config = mkIf cfg.enable (mkMerge [ @@ -179,5 +272,15 @@ in { debugger.nvim-dap.enable = true; }; }) + + (mkIf cfg.extraDiagnostics.enable { + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.go = cfg.extraDiagnostics.types; + linters = + mkMerge (map (name: {${name} = diagnosticsProviders.${name}.config;}) + cfg.extraDiagnostics.types); + }; + }) ]); } diff --git a/modules/plugins/languages/jinja.nix b/modules/plugins/languages/jinja.nix new file mode 100644 index 00000000..a4635f58 --- /dev/null +++ b/modules/plugins/languages/jinja.nix @@ -0,0 +1,65 @@ +{ + config, + pkgs, + lib, + ... +}: let + inherit (builtins) attrNames; + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.options) mkEnableOption mkOption; + inherit (lib.types) enum listOf; + inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.attrsets) mapListToAttrs; + + cfg = config.vim.languages.jinja; + defaultServers = ["jinja-lsp"]; + servers = { + jinja-lsp = { + enable = true; + cmd = [(getExe pkgs.jinja-lsp)]; + filetypes = ["jinja"]; + root_markers = [ + ".git" + ]; + }; + }; +in { + options.vim.languages.jinja = { + enable = mkEnableOption "Jinja template language support"; + + treesitter = { + enable = mkEnableOption "Jinja treesitter" // {default = config.vim.languages.enableTreesitter;}; + package = mkGrammarOption pkgs "jinja"; + inlinePackage = mkGrammarOption pkgs "jinja_inline"; + }; + + lsp = { + enable = mkEnableOption "Jinja LSP support" // {default = config.vim.lsp.enable;}; + servers = mkOption { + description = "Jinja LSP server to use"; + type = listOf (enum (attrNames servers)); + default = defaultServers; + }; + }; + }; + + config = mkIf cfg.enable (mkMerge [ + (mkIf cfg.treesitter.enable { + vim.treesitter.enable = true; + vim.treesitter.grammars = [ + cfg.treesitter.package + cfg.treesitter.inlinePackage + ]; + }) + + (mkIf cfg.lsp.enable { + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; + }) + ]); +} diff --git a/modules/plugins/languages/rust.nix b/modules/plugins/languages/rust.nix index 015b2956..ec5a3d81 100644 --- a/modules/plugins/languages/rust.nix +++ b/modules/plugins/languages/rust.nix @@ -228,10 +228,17 @@ in { (mkIf cfg.extensions.crates-nvim.enable { vim = mkMerge [ { - startPlugins = ["crates-nvim"]; - pluginRC.rust-crates = entryAnywhere '' - require("crates").setup(${toLuaObject cfg.extensions.crates-nvim.setupOpts}) - ''; + lazy.plugins.crates-nvim = { + package = "crates-nvim"; + setupModule = "crates"; + setupOpts = cfg.extensions.crates-nvim.setupOpts; + event = [ + { + event = "BufRead"; + pattern = "Cargo.toml"; + } + ]; + }; } ]; }) diff --git a/modules/plugins/languages/tera.nix b/modules/plugins/languages/tera.nix new file mode 100644 index 00000000..7e1d5573 --- /dev/null +++ b/modules/plugins/languages/tera.nix @@ -0,0 +1,28 @@ +{ + config, + pkgs, + lib, + ... +}: let + inherit (lib.options) mkEnableOption; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.nvim.types) mkGrammarOption; + + cfg = config.vim.languages.tera; +in { + options.vim.languages.tera = { + enable = mkEnableOption "Tera templating language support"; + + treesitter = { + enable = mkEnableOption "Tera treesitter" // {default = config.vim.languages.enableTreesitter;}; + package = mkGrammarOption pkgs "tera"; + }; + }; + + config = mkIf cfg.enable (mkMerge [ + (mkIf cfg.treesitter.enable { + vim.treesitter.enable = true; + vim.treesitter.grammars = [cfg.treesitter.package]; + }) + ]); +} diff --git a/modules/plugins/languages/xml.nix b/modules/plugins/languages/xml.nix new file mode 100644 index 00000000..351232a9 --- /dev/null +++ b/modules/plugins/languages/xml.nix @@ -0,0 +1,62 @@ +{ + config, + pkgs, + lib, + ... +}: let + inherit (builtins) attrNames; + inherit (lib.options) mkOption mkEnableOption; + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.types) enum listOf; + inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.attrsets) mapListToAttrs; + + cfg = config.vim.languages.xml; + + defaultServers = ["lemminx"]; + servers = { + lemminx = { + enable = true; + cmd = [ + (getExe pkgs.lemminx) + ]; + filetypes = ["xml"]; + root_markers = [".git"]; + }; + }; +in { + options.vim.languages.xml = { + enable = mkEnableOption "XML language support"; + + treesitter = { + enable = mkEnableOption "XML treesitter" // {default = config.vim.languages.enableTreesitter;}; + package = mkGrammarOption pkgs "xml"; + }; + + lsp = { + enable = mkEnableOption "XML LSP support" // {default = config.vim.lsp.enable;}; + servers = mkOption { + type = listOf (enum (attrNames servers)); + default = defaultServers; + description = "XML LSP server to use"; + }; + }; + }; + + config = mkIf cfg.enable (mkMerge [ + (mkIf cfg.treesitter.enable { + vim.treesitter.enable = true; + vim.treesitter.grammars = [cfg.treesitter.package]; + }) + + (mkIf cfg.lsp.enable { + vim.lsp.servers = + mapListToAttrs (name: { + inherit name; + value = servers.${name}; + }) + cfg.lsp.servers; + }) + ]); +} diff --git a/modules/plugins/minimap/codewindow/codewindow.nix b/modules/plugins/minimap/codewindow/codewindow.nix index 381e3102..9ad48c9f 100644 --- a/modules/plugins/minimap/codewindow/codewindow.nix +++ b/modules/plugins/minimap/codewindow/codewindow.nix @@ -1,6 +1,7 @@ {lib, ...}: let inherit (lib.options) mkEnableOption; inherit (lib.nvim.binds) mkMappingOption; + inherit (lib.nvim.types) mkPluginSetupOption; in { options.vim.minimap.codewindow = { enable = mkEnableOption "codewindow plugin for minimap view"; @@ -11,5 +12,7 @@ in { toggle = mkMappingOption "Toggle minimap [codewindow]" "mm"; toggleFocus = mkMappingOption "Toggle minimap focus [codewindow]" "mf"; }; + + setupOpts = mkPluginSetupOption "codewindow" {}; }; } diff --git a/modules/plugins/minimap/codewindow/config.nix b/modules/plugins/minimap/codewindow/config.nix index 8a62ee04..020eab7d 100644 --- a/modules/plugins/minimap/codewindow/config.nix +++ b/modules/plugins/minimap/codewindow/config.nix @@ -6,6 +6,7 @@ }: let inherit (lib.modules) mkIf mkMerge; inherit (lib.nvim.dag) entryAnywhere; + inherit (lib.nvim.lua) toLuaObject; inherit (lib.nvim.binds) addDescriptionsToMappings mkSetLuaBinding pushDownDefault; cfg = config.vim.minimap.codewindow; @@ -32,9 +33,7 @@ in { pluginRC.codewindow = entryAnywhere '' local codewindow = require('codewindow') - codewindow.setup({ - exclude_filetypes = { 'NvimTree', 'orgagenda', 'Alpha'}, - }) + codewindow.setup(${toLuaObject cfg.setupOpts}) ''; }; }; diff --git a/modules/plugins/treesitter/config.nix b/modules/plugins/treesitter/config.nix index ab7d2cae..899e7c19 100644 --- a/modules/plugins/treesitter/config.nix +++ b/modules/plugins/treesitter/config.nix @@ -21,18 +21,9 @@ in { treesitter.grammars = optionals cfg.addDefaultGrammars cfg.defaultGrammars; - # Define the autogroup for treesitter here rather than in the Lua snippet - # to allow overriding more easily. Should be highly unlikely that a user - # wants to override, but not impossible. - augroups = [ - { - enable = true; - name = "nvf_treesitter"; - clear = true; - } - ]; - pluginRC.treesitter-autocommands = entryAfter ["basic"] '' + vim.api.nvim_create_augroup("nvf_treesitter", { clear = true }) + ${lib.optionalString cfg.highlight.enable '' -- Enable treesitter highlighting for all filetypes vim.api.nvim_create_autocmd("FileType", { @@ -63,7 +54,6 @@ in { callback = function() vim.wo[0][0].foldmethod = "expr" vim.wo[0][0].foldexpr = "v:lua.vim.treesitter.foldexpr()" - -- This is optional, but is set rather as a sane default. -- If unset, opened files will be folded by automatically as -- the files are opened diff --git a/npins/sources.json b/npins/sources.json index 9bbcb6ff..d9d1f9cc 100644 --- a/npins/sources.json +++ b/npins/sources.json @@ -973,9 +973,9 @@ }, "branch": "main", "submodules": false, - "revision": "de79a7626d54d7785436105ef72f37ee8fe8fa16", - "url": "https://github.com/OXY2DEV/markview.nvim/archive/de79a7626d54d7785436105ef72f37ee8fe8fa16.tar.gz", - "hash": "sha256-kGhohG4Aw9wMceLiX+s2HCWIyWuJYHoa9D80elM1UQw=" + "revision": "c81ce9ed129387fc5fdec91abe9818a1b0e6fcac", + "url": "https://github.com/OXY2DEV/markview.nvim/archive/c81ce9ed129387fc5fdec91abe9818a1b0e6fcac.tar.gz", + "hash": "sha256-CoPfVkPWh5neyIT1rVEHMLo7532lWvbv0Gg/27D0PHw=" }, "mellow": { "type": "Git",