-- ============================================================================ -- 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("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, }) -- 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 }, }, } -- 启用所有 LSP(Rust 由 rustaceanvim 管理) vim.lsp.enable({ 'lua_ls', 'bashls', 'clangd', 'neocmake' }) end, }, }