if not vim.fn.executable("rust") then return end -- adapted from https://www.lazyvim.org/extras/lang/rust return { { "hrsh7th/nvim-cmp", opts = function(_, opts) opts.sources = opts.sources or {} table.insert(opts.sources, { name = "crates" }) end, }, { "Saecki/crates.nvim", event = { "BufRead Cargo.toml" }, opts = { completions = { cmp = { enabled = true }, }, }, }, { "nvim-treesitter/nvim-treesitter", opts = function(_, opts) opts.ensure_installed = opts.ensure_installed or {} vim.list_extend(opts.ensure_installed, { "ron", "rust", "toml" }) end, }, { "mrcjkb/rustaceanvim", version = "^4", -- Recommended ft = { "rust" }, opts = { server = { on_attach = function(_, bufnr) vim.keymap.set("n", "cR", function() vim.cmd.RustLsp("codeAction") end, { desc = "Code Action", buffer = bufnr }) vim.keymap.set("n", "dr", function() vim.cmd.RustLsp("debuggables") end, { desc = "Rust debuggables", buffer = bufnr }) end, default_settings = { -- rust-analyzer language server configuration ["rust-analyzer"] = { cargo = { allFeatures = true, loadOutDirsFromCheck = true, runBuildScripts = true, }, -- Add clippy lints for Rust. checkOnSave = { allFeatures = true, command = "clippy", extraArgs = { "--no-deps" }, }, procMacro = { enable = true, ignored = { ["async-trait"] = { "async_trait" }, ["napi-derive"] = { "napi" }, ["async-recursion"] = { "async_recursion" }, }, }, }, }, }, }, config = function(_, opts) vim.g.rustaceanvim = vim.tbl_deep_extend("keep", vim.g.rustaceanvim or {}, opts or {}) end, }, { "neovim/nvim-lspconfig", opts = { servers = { rust_analyzer = {}, taplo = { keys = { { "K", function() if vim.fn.expand("%:t") == "Cargo.toml" and require("crates").popup_available() then require("crates").show_popup() else vim.lsp.buf.hover() end end, desc = "Show Crate Documentation", }, }, }, }, setup = { rust_analyzer = function() return true end, }, }, }, }