From 99b003f67f2d45f3024a16d3ce4175e2c2080163 Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Sat, 18 Oct 2025 12:57:19 +0300 Subject: [PATCH] languages/rust: move `crates.nvim` dependency to `extensions` modernize Signed-off-by: NotAShelf Change-Id: I6a6a69648fea60c9113ac066fcffecc2364c9aae --- docs/release-notes/rl-0.8.md | 3 ++ modules/plugins/languages/rust.nix | 82 +++++++++++++++++++----------- 2 files changed, 54 insertions(+), 31 deletions(-) diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 7f58e802..d26fd772 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -115,6 +115,9 @@ - Add [hunk.nvim], Neovim plugin & tool for splitting diffs in Neovim. Available as `vim.git.hunk-nvim` +- Move `crates.nvim` into `languages.rust.extensions and support` `setupOpts` + for the plugin. Deprecates the top level "crates" option in `languages.rust`. + [sjcobb2022](https://github.com/sjcobb2022): - Migrate all current lsp configurations to `vim.lsp.server` and remove internal diff --git a/modules/plugins/languages/rust.nix b/modules/plugins/languages/rust.nix index 17a82a40..6e9a2457 100644 --- a/modules/plugins/languages/rust.nix +++ b/modules/plugins/languages/rust.nix @@ -4,16 +4,15 @@ lib, ... }: let - inherit (builtins) attrNames; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; inherit (lib.options) mkOption mkEnableOption literalMD; inherit (lib.strings) optionalString; - inherit (lib.trivial) boolToString; inherit (lib.lists) isList; + inherit (lib.attrsets) attrNames; inherit (lib.types) bool package str listOf either enum; - inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.lua) toLuaObject; + inherit (lib.nvim.types) mkGrammarOption mkPluginSetupOption; + inherit (lib.nvim.lua) expToLua toLuaObject; inherit (lib.nvim.dag) entryAfter entryAnywhere; cfg = config.vim.languages.rust; @@ -33,15 +32,6 @@ in { package = mkGrammarOption pkgs "rust"; }; - crates = { - enable = mkEnableOption "crates-nvim, tools for managing dependencies"; - codeActions = mkOption { - description = "Enable code actions through null-ls"; - type = bool; - default = true; - }; - }; - lsp = { enable = mkEnableOption "Rust LSP support (rust-analyzer with extra tools)" // {default = config.vim.lsp.enable;}; package = mkOption { @@ -103,25 +93,32 @@ in { default = pkgs.lldb; }; }; + + extensions = { + crates-nvim = { + enable = mkEnableOption "crates.io dependency management [crates-nvim]"; + + setupOpts = mkPluginSetupOption "crates-nvim" { + completion.enable = mkOption { + type = bool; + default = config.vim.autocomplete.nvim-cmp.enable; + defaultText = "{option}`config.vim.autocomplete.nvim-cmp.enable`"; + description = '' + Whether to add crates.nvim as a source for completion plugins. The following + plugins are supported by crates.nvim: + + * nvim-cmp + * coq.nvim + + However nvf only supports auto-setup for nvim-cmp. + ''; + }; + }; + }; + }; }; config = mkIf cfg.enable (mkMerge [ - (mkIf cfg.crates.enable { - vim = { - startPlugins = ["crates-nvim"]; - lsp.null-ls.enable = mkIf cfg.crates.codeActions true; - autocomplete.nvim-cmp.sources = {crates = "[Crates]";}; - pluginRC.rust-crates = entryAnywhere '' - require('crates').setup { - null_ls = { - enabled = ${boolToString cfg.crates.codeActions}, - name = "crates.nvim", - } - } - ''; - }; - }) - (mkIf cfg.treesitter.enable { vim.treesitter.enable = true; vim.treesitter.grammars = [cfg.treesitter.package]; @@ -140,7 +137,6 @@ in { (mkIf (cfg.lsp.enable || cfg.dap.enable) { vim = { startPlugins = ["rustaceanvim"]; - pluginRC.rustaceanvim = entryAfter ["lsp-setup"] '' vim.g.rustaceanvim = { ${optionalString cfg.lsp.enable '' @@ -153,13 +149,14 @@ in { server = { cmd = ${ if isList cfg.lsp.package - then toLuaObject cfg.lsp.package + then expToLua cfg.lsp.package else ''{"${cfg.lsp.package}/bin/rust-analyzer"}'' }, default_settings = { ${cfg.lsp.opts} }, on_attach = function(client, bufnr) + default_on_attach(client, bufnr) local opts = { noremap=true, silent=true, buffer = bufnr } vim.keymap.set("n", "rr", ":RustLsp runnables", opts) vim.keymap.set("n", "rp", ":RustLsp parentModule", opts) @@ -198,5 +195,28 @@ in { ''; }; }) + + (mkIf cfg.extensions.crates-nvim.enable { + vim = let + withCompletion = cfg.extensions.crates-nvim.withCmpSource; + in + mkMerge [ + { + startPlugins = ["crates-nvim"]; + pluginRC.rust-crates = entryAnywhere '' + require("crates").setup(${toLuaObject cfg.extensions.crates-nvim.setupOpts}) + ''; + } + + # FIXME: this will not be necessary once crates.nvim creates a new release that + # ships improvements to the in-progress LSP module. If updating > 0.7.1, remember + # to update this section. + # See: + # + (mkIf withCompletion { + autocomplete.nvim-cmp.sources = {crates = "[Crates]";}; + }) + ]; + }) ]); }