141 lines
5.2 KiB
Lua
141 lines
5.2 KiB
Lua
-- ============================================================================
|
||
-- LSP 语言服务器
|
||
-- ============================================================================
|
||
|
||
return {
|
||
-- Mason: 外部工具管理 (:Mason 打开管理界面)
|
||
{
|
||
"williamboman/mason.nvim",
|
||
cmd = "Mason",
|
||
opts = {},
|
||
},
|
||
|
||
-- Mason 与 LSP 桥接,自动安装指定服务器
|
||
{
|
||
"williamboman/mason-lspconfig.nvim",
|
||
dependencies = { "williamboman/mason.nvim" },
|
||
opts = {
|
||
ensure_installed = {
|
||
"lua_ls", -- Lua
|
||
"bashls", -- Bash
|
||
"clangd", -- C/C++
|
||
"neocmake", -- CMake
|
||
-- rust_analyzer 由 rustup 管理,不通过 Mason
|
||
},
|
||
},
|
||
},
|
||
|
||
-- LSP 配置(Neovim 0.11+ vim.lsp.config API)
|
||
{
|
||
"neovim/nvim-lspconfig",
|
||
event = { "BufReadPre", "BufNewFile" },
|
||
dependencies = {
|
||
"williamboman/mason.nvim",
|
||
"williamboman/mason-lspconfig.nvim",
|
||
"saghen/blink.cmp",
|
||
},
|
||
config = function()
|
||
local caps = require("blink.cmp").get_lsp_capabilities()
|
||
|
||
-- LSP 附加时自动开启 inlay hints
|
||
vim.api.nvim_create_autocmd("LspAttach", {
|
||
callback = function(args)
|
||
local map = function(keys, func, desc)
|
||
vim.keymap.set("n", keys, func, { buffer = args.buf, desc = desc })
|
||
end
|
||
map("gd", vim.lsp.buf.definition, "跳转到定义")
|
||
map("gr", vim.lsp.buf.references, "查找引用")
|
||
map("K", vim.lsp.buf.hover, "悬浮文档")
|
||
map("<leader>rn", vim.lsp.buf.rename, "重命名")
|
||
map("<M-CR>", vim.lsp.buf.code_action, "代码操作")
|
||
map("<leader>d", vim.diagnostic.open_float, "行诊断")
|
||
map("[d", vim.diagnostic.goto_prev, "上一个诊断")
|
||
map("]d", vim.diagnostic.goto_next, "下一个诊断")
|
||
|
||
-- 开启 inlay hints
|
||
vim.lsp.inlay_hint.enable(true, { bufnr = args.buf })
|
||
end,
|
||
})
|
||
|
||
-- Lua
|
||
vim.lsp.config['lua_ls'] = {
|
||
cmd = { 'lua-language-server' },
|
||
filetypes = { 'lua' },
|
||
root_markers = { '.luarc.json', '.luarc.jsonc', '.git', 'init.lua' },
|
||
capabilities = caps,
|
||
settings = {
|
||
Lua = {
|
||
runtime = { version = "LuaJIT" },
|
||
workspace = { checkThirdParty = false },
|
||
diagnostics = { globals = { "vim" } },
|
||
},
|
||
},
|
||
}
|
||
|
||
-- Bash
|
||
vim.lsp.config['bashls'] = {
|
||
cmd = { 'bash-language-server', 'start' },
|
||
filetypes = { 'sh', 'bash' },
|
||
root_markers = { '.git' },
|
||
capabilities = caps,
|
||
}
|
||
|
||
-- C/C++ (clangd)
|
||
vim.lsp.config['clangd'] = {
|
||
cmd = { 'clangd' },
|
||
filetypes = { 'c', 'cpp', 'objc', 'objcpp' },
|
||
root_markers = { '.clangd', 'compile_commands.json', '.git' },
|
||
capabilities = caps,
|
||
}
|
||
|
||
-- CMake
|
||
vim.lsp.config['neocmake'] = {
|
||
cmd = { 'neocmakelsp', 'stdio' },
|
||
filetypes = { 'cmake' },
|
||
root_markers = { 'CMakeLists.txt', '.git' },
|
||
capabilities = caps,
|
||
init_options = {
|
||
format = { enable = true },
|
||
lint = { enable = true },
|
||
},
|
||
}
|
||
|
||
-- Rust (rust-analyzer)
|
||
vim.lsp.config['rust_analyzer'] = {
|
||
cmd = { 'rust-analyzer' }, -- 使用 rustup 的版本,更稳定
|
||
filetypes = { 'rust' },
|
||
root_markers = { 'Cargo.toml', '.git' },
|
||
capabilities = caps,
|
||
settings = {
|
||
["rust-analyzer"] = {
|
||
cargo = {
|
||
allFeatures = true,
|
||
loadOutDirsFromCheck = true,
|
||
buildScripts = {
|
||
enable = true,
|
||
},
|
||
},
|
||
checkOnSave = true,
|
||
diagnostics = {
|
||
enable = true,
|
||
},
|
||
procMacro = {
|
||
enable = true,
|
||
},
|
||
files = {
|
||
exclude = {
|
||
".direnv", ".git", ".jj", ".github", ".gitlab",
|
||
"bin", "node_modules", "target", "venv", ".venv",
|
||
},
|
||
watcher = "client",
|
||
},
|
||
},
|
||
},
|
||
}
|
||
|
||
-- 启用所有 LSP
|
||
vim.lsp.enable({ 'lua_ls', 'bashls', 'clangd', 'neocmake', 'rust_analyzer' })
|
||
end,
|
||
},
|
||
}
|