mirror of
https://github.com/LazyVim/LazyVim.git
synced 2026-07-21 20:11:06 +00:00
## Description
`mason-lspconfig` v2 made changes to conform with latest Neovim
`vim.lsp.config`/`vim.lsp.enable` API.
- Lock `mason` and `mason-lspconfig` to v1 versions for Neovim <0.11 and
latest HEAD for Neovim >=0.11.
- Change `:get_install_path()` method in LazyVim to use
`LazyVim.get_pkg_path()` and also update name references to new ones.
- Change `nvim-lspconfig` from `LazyFile` to `{ "BufReadPre",
"BufNewFile", "BufWritePre" }` for Neovim >=0.11, since on `BufReadPost`
the LSP would not attach on the first buffer. Previously the
`setup.handlers()` function from `mason-lspconfig` would take care of
that, but that has been removed on v2. I fail to think if there's a
better way to handle this.
Most of the changes in `/lsp/init.lua` are thanks to @williamboman
comment
[here](https://github.com/LazyVim/LazyVim/pull/6041#issuecomment-2857266471).
I've also seen that both `mason-lspconfig` and `rustaceanvim` now have
as minimum requirements Neovim >=0.11.
As such I would suggest, instead of all the conditional checks for
Neovim versions to create a stable release where we pin `mason` and
`mason-lspconfig` to v1 versions and then only incorporate William's
suggestions in a new release and mention in the README that users who
are on Neovim <0.11 should use the stable release where the plugin
versions are pinned to v1. Not sure how you want to tackle this, so this
is merely just a suggestion from my part.
Both #6041 and #6045 tackle only with the new name references and the
offending line that was causing the error, but don't take into
consideration the LSP servers configurations. `opts.setup` would not
execute on both, since that was handled by `setup_handlers()` function
in the past. I checked with Typescript lang and with those PRs there are
no Javascript settings in `vtsls` (by checking with
`:=LazyVim.opts("nvim-lspconfig").servers.vtsls`).
#6045 also tried to change the method `:get_install_pkg()` by using
`vim.fn.exepath`, but to my understanding that only returns the binary
path not the package installation path and that is later concatenated to
find other paths, which I believe is not correct.
PS: There are 2 commits, because my LazyVim fork was not up to date and
updated it and then merged the branch I had into a new branch. Sorry if
that causes any inconvenience.
<!-- Describe the big picture of your changes to communicate to the
maintainers
why we should accept this pull request. -->
## Related Issue(s)
Fixes #6039
<!--
If this PR fixes any issues, please link to the issue here.
- Fixes #<issue_number>
-->
## Screenshots
<!-- Add screenshots of the changes if applicable. -->
## Checklist
- [x] I've read the
[CONTRIBUTING](https://github.com/LazyVim/LazyVim/blob/main/CONTRIBUTING.md)
guidelines.
---------
Co-authored-by: Folke Lemaitre <folke.lemaitre@gmail.com>
Co-authored-by: William Boman <william@redwill.se>
Co-authored-by: Luis Durão <kpvrzlzzx@mozmail.com>
152 lines
4.1 KiB
Lua
152 lines
4.1 KiB
Lua
if lazyvim_docs then
|
|
-- LSP Server to use for Rust.
|
|
-- Set to "bacon-ls" to use bacon-ls instead of rust-analyzer.
|
|
-- only for diagnostics. The rest of LSP support will still be
|
|
-- provided by rust-analyzer.
|
|
vim.g.lazyvim_rust_diagnostics = "rust-analyzer"
|
|
end
|
|
|
|
local diagnostics = vim.g.lazyvim_rust_diagnostics or "rust-analyzer"
|
|
|
|
return {
|
|
recommended = function()
|
|
return LazyVim.extras.wants({
|
|
ft = "rust",
|
|
root = { "Cargo.toml", "rust-project.json" },
|
|
})
|
|
end,
|
|
|
|
-- LSP for Cargo.toml
|
|
{
|
|
"Saecki/crates.nvim",
|
|
event = { "BufRead Cargo.toml" },
|
|
opts = {
|
|
completion = {
|
|
crates = {
|
|
enabled = true,
|
|
},
|
|
},
|
|
lsp = {
|
|
enabled = true,
|
|
actions = true,
|
|
completion = true,
|
|
hover = true,
|
|
},
|
|
},
|
|
},
|
|
|
|
-- Add Rust & related to treesitter
|
|
{
|
|
"nvim-treesitter/nvim-treesitter",
|
|
opts = { ensure_installed = { "rust", "ron" } },
|
|
},
|
|
|
|
-- Ensure Rust debugger is installed
|
|
{
|
|
"mason-org/mason.nvim",
|
|
optional = true,
|
|
opts = function(_, opts)
|
|
opts.ensure_installed = opts.ensure_installed or {}
|
|
vim.list_extend(opts.ensure_installed, { "codelldb" })
|
|
if diagnostics == "bacon-ls" then
|
|
vim.list_extend(opts.ensure_installed, { "bacon" })
|
|
end
|
|
end,
|
|
},
|
|
|
|
{
|
|
"mrcjkb/rustaceanvim",
|
|
ft = { "rust" },
|
|
opts = {
|
|
server = {
|
|
on_attach = function(_, bufnr)
|
|
vim.keymap.set("n", "<leader>cR", function()
|
|
vim.cmd.RustLsp("codeAction")
|
|
end, { desc = "Code Action", buffer = bufnr })
|
|
vim.keymap.set("n", "<leader>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,
|
|
buildScripts = {
|
|
enable = true,
|
|
},
|
|
},
|
|
-- Add clippy lints for Rust if using rust-analyzer
|
|
checkOnSave = diagnostics == "rust-analyzer",
|
|
-- Enable diagnostics if using rust-analyzer
|
|
diagnostics = {
|
|
enable = diagnostics == "rust-analyzer",
|
|
},
|
|
procMacro = {
|
|
enable = true,
|
|
ignored = {
|
|
["async-trait"] = { "async_trait" },
|
|
["napi-derive"] = { "napi" },
|
|
["async-recursion"] = { "async_recursion" },
|
|
},
|
|
},
|
|
files = {
|
|
excludeDirs = {
|
|
".direnv",
|
|
".git",
|
|
".github",
|
|
".gitlab",
|
|
"bin",
|
|
"node_modules",
|
|
"target",
|
|
"venv",
|
|
".venv",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
config = function(_, opts)
|
|
if LazyVim.has("mason.nvim") then
|
|
local codelldb = vim.fn.exepath("codelldb")
|
|
local codelldb_lib_ext = io.popen("uname"):read("*l") == "Linux" and ".so" or ".dylib"
|
|
local library_path = vim.fn.expand("$MASON/opt/lldb/lib/liblldb" .. codelldb_lib_ext)
|
|
opts.dap = {
|
|
adapter = require("rustaceanvim.config").get_codelldb_adapter(codelldb, library_path),
|
|
}
|
|
end
|
|
vim.g.rustaceanvim = vim.tbl_deep_extend("keep", vim.g.rustaceanvim or {}, opts or {})
|
|
if vim.fn.executable("rust-analyzer") == 0 then
|
|
LazyVim.error(
|
|
"**rust-analyzer** not found in PATH, please install it.\nhttps://rust-analyzer.github.io/",
|
|
{ title = "rustaceanvim" }
|
|
)
|
|
end
|
|
end,
|
|
},
|
|
|
|
-- Correctly setup lspconfig for Rust 🚀
|
|
{
|
|
"neovim/nvim-lspconfig",
|
|
opts = {
|
|
servers = {
|
|
bacon_ls = {
|
|
enabled = diagnostics == "bacon-ls",
|
|
},
|
|
rust_analyzer = { enabled = false },
|
|
},
|
|
},
|
|
},
|
|
|
|
{
|
|
"nvim-neotest/neotest",
|
|
optional = true,
|
|
opts = {
|
|
adapters = {
|
|
["rustaceanvim.neotest"] = {},
|
|
},
|
|
},
|
|
},
|
|
}
|