local lsp_installer = require('nvim-lsp-installer') local lspconfig = require('lspconfig') local async = require('plenary.async') -- NOTE: Keep this near top lsp_installer.setup({}) local required_servers = { 'sumneko_lua', 'rust_analyzer', 'bashls', 'eslint', 'dockerls', 'ansiblels', 'tsserver', 'yamlls', 'jdtls', 'pylsp', 'html', 'vimls', 'clangd', 'omnisharp', 'sqls', } for _, name in pairs(required_servers) do local server_is_found, server = lsp_installer.get_server(name) if server_is_found then if not server:is_installed() then async.run(function() vim.notify.async('Installing Language Server ' .. name, 'info', { title = 'Lsp Installer', }) end) server:install() end end end local function on_attach(client, bufnr) async.run(function() vim.notify.async('Attached server ' .. client.name, 'info', { title = 'Lsp Attach', }).events.close() end) end local lsp_capabilities = require('cmp_nvim_lsp').update_capabilities(vim.lsp.protocol.make_client_capabilities()) local opts = { capabilities = lsp_capabilities, on_attach = on_attach, } -- INFO: RUST LSP -- In the scenario we're using rust it makes more sense to use rust-tools -- see: https://github.com/williamboman/nvim-lsp-installer/wiki/Rust -- -- NOTE: Requires rust_analyzer -- -- Dap installation, required vscode and the following extension to be installed: -- https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb -- -- locate it with `find ~/ -name ` local extension_path = os.getenv('HOME') .. '/.vscode/extensions/vadimcn.vscode-lldb-1.6.10/' local codelldb_path = extension_path .. 'adapter/codelldb' local liblldb_path = extension_path .. 'lldb/lib/liblldb.dylib' local rustopts = { server = opts, dap = { adapter = require('rust-tools.dap').get_codelldb_adapter(codelldb_path, liblldb_path), }, tools = { hover_actions = { auto_focus = true }, }, } require('rust-tools').setup(rustopts) -- NOTE: ANSIBLE LSP -- I use ansible a lot, define exceptions for servers that can use -- server:setup & vim.cmd at the bottom here lspconfig.ansiblels.setup({ ansible = { ansible = { useFullyQualifiedCollectionNames = true, path = 'ansible', }, ansibleLint = { enabled = true, path = 'ansible-lint', }, python = { interpreterPath = 'python3', }, }, }) -- NOTE: BASH LSP lspconfig.bashls.setup({ filetypes = { 'zsh', 'bash', 'sh', }, opts, }) -- NOTE: PYTHON LSP lspconfig.pylsp.setup({ opts, }) local luadev = require('lua-dev').setup({ lspconfig = opts, }) lspconfig.sumneko_lua.setup(luadev) lspconfig.sqls.setup({ on_attach = function(client, bufnr) require('sqls').on_attach(client, bufnr) end, }) -- NOTE: GENERIC LSP SERVERS for _, server in ipairs({ 'tsserver', 'eslint', 'dockerls', 'yamlls', 'kotlin_language_server', 'jdtls', 'vuels', 'html', 'vimls', 'clangd', 'cmake', 'omnisharp', }) do lspconfig[server].setup(opts) end