-- ============================================================================ -- 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 }, }, }, -- 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() -- 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("rn", vim.lsp.buf.rename, "重命名") map("", vim.lsp.buf.code_action, "代码操作") map("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, }) local caps = require("blink.cmp").get_lsp_capabilities() -- Lua vim.lsp.config("lua_ls", { cmd = { "lua-language-server" }, capabilities = caps, settings = { Lua = { runtime = { version = "Lua5.5" }, workspace = { checkThirdParty = false }, diagnostics = { globals = { "vim" } }, }, }, }) -- Bash vim.lsp.config("bashls", { cmd = { "bash-language-server", "start" }, capabilities = caps, }) -- C/C++ (clangd) vim.lsp.config("clangd", { cmd = { "clangd" }, capabilities = caps, }) -- CMake vim.lsp.config("neocmake", { cmd = { "neocmakelsp", "stdio" }, filetypes = { "cmake" }, root_dir = vim.fs.root(0, { ".git", "CMakeLists.txt" }), single_file_support = true, init_options = { format = { enable = true }, lint = { enable = true }, }, }) -- 启用所有 LSP(Rust 由 rustaceanvim 管理,不在此启用) vim.lsp.enable({ "lua_ls", "bashls", "clangd", "neocmake" }) end, }, }