local misc = require("core.misc") local lsp = require("core.lsp.functions") local map = misc.map return { "williamboman/mason-lspconfig.nvim", requires = { "williamboman/mason.nvim", { "neovim/nvim-lspconfig", disable = not vim.fn.has("nvim-0.8.0"), function() lsp.setup() end }, -- these two update some lsp capabilities and therefore must be run first -- "hrsh7th/cmp-nvim-lsp", -- "kevinhwang91/nvim-ufo" }, function() local lspconfig = require("lspconfig") local util = require("lspconfig.util") -- setup language servers require("mason-lspconfig").setup { ensure_installed = { "lua_ls", "clangd", "jdtls", "phpactor", "html", "cssls", "bashls", "zls" -- "asm-lsp", -- seems to be broken }, -- setup all handlers handlers = { function(server_name) lspconfig[server_name].setup {} end, -- setup luals ["lua_ls"] = function(server_name) local root_files = { ".luarc.json", ".luarc.jsonc", ".luacheckrc", ".stylua.toml", "stylua.toml", "selene.toml", "selene.yml", "README.md" } -- FIXME: luals seems to start up twice and sends back twice the -- completions (one configured with the below settings and one without) lspconfig[server_name].setup { settings = { Lua = { diagnostics = { globals = { "vim", "mp" } }, runtime = { version = "LuaJIT" }, format = { enable = false }, workspace = { checkThirdParty = false, library = { vim.env.VIMRUNTIME } } } }, root_dir = function(fname) local root = util.root_pattern(unpack(root_files))(fname) if root and root ~= vim.env.HOME then return root end root = util.root_pattern("lua/")(fname) if root then return root end return util.find_git_ancestor(fname) end } end, -- setup clangd ["clangd"] = function(server_name) lspconfig[server_name].setup { on_attach = function(client, bufnr) -- add some clangd specific mappings local opts = { buffer = bufnr } map("n", "o", "ClangdSwitchSourceHeader", opts) end, cmd = { "clangd", "--background-index", "--clang-tidy", "--header-insertion=iwyu", "--completion-style=detailed", "--function-arg-placeholders", "--fallback-style=llvm" }, init_options = { usePlaceholders = true, clangdFileStatus = true, fallback_flags = { "-xc" -- makes clangd think we"re using c instead of c++ } } } end, -- disable it, we start this using nvim-jdtls ["jdtls"] = function(_) end, -- setup basedpyright ["basedpyright"] = function(server_name) lspconfig[server_name].setup { on_attach = function(client, bufnr) -- add some basedpyright specific mappings local opts = { buffer = bufnr } map("n", "cri", "PyrightOrganizeImports", opts) end, } end }, ["openscad_lsp"] = function(server_name) lspconfig[server_name].setup {} end } end }