require("nvim-lsp-installer").setup({ automatic_installation = true, }) local lsp_installer_servers = require'nvim-lsp-installer.servers' local cmp_lsp = require('cmp_nvim_lsp') local null_ls = require("null-ls") local lspconfig = require("lspconfig") null_ls.setup({ sources = { null_ls.builtins.diagnostics.vale, }, }) -- Use an on_attach function to only map the following keys -- after the language server attaches to the current buffer local on_attach = function(client, bufnr) local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end -- Enable completion triggered by buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc') -- Mappings. local opts = { noremap=true, silent=true } -- See `:help vim.lsp.*` for documentation on any of the below functions buf_set_keymap('n', 'gD', 'lua vim.lsp.buf.declaration()', opts) --buf_set_keymap('n', 'gd', 'lua vim.lsp.buf.definition()', opts) buf_set_keymap('n', 'gd', "lua require('telescope.builtin').lsp_definitions()", opts) buf_set_keymap('n', 'K', 'lua vim.lsp.buf.hover()', opts) --buf_set_keymap('n', 'gi', 'lua vim.lsp.buf.implementation()', opts) buf_set_keymap('n', 'gi', "lua require('telescope.builtin').lsp_implementations()", opts) buf_set_keymap('n', '', 'lua vim.lsp.buf.signature_help()', opts) buf_set_keymap('n', 'wa', 'lua vim.lsp.buf.add_workspace_folder()', opts) buf_set_keymap('n', 'wr', 'lua vim.lsp.buf.remove_workspace_folder()', opts) buf_set_keymap('n', 'wl', 'lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))', opts) --buf_set_keymap('n', 'D', 'lua vim.lsp.buf.type_definition()', opts) buf_set_keymap('n', 'D', "lua require('telescope.builtin').lsp_type_definitions()", opts) buf_set_keymap('n', 'rn', 'lua vim.lsp.buf.rename()', opts) --buf_set_keymap('n', 'ca', 'lua vim.lsp.buf.code_action()', opts) buf_set_keymap('n', 'ca', "lua require('telescope.builtin').lsp_code_actions()", opts) --buf_set_keymap('n', 'gr', 'lua vim.lsp.buf.references()', opts) buf_set_keymap('', 'gr', "lua require('telescope.builtin').lsp_references()", opts) buf_set_keymap('n', 'e', 'lua vim.lsp.diagnostic.show_line_diagnostics()', opts) buf_set_keymap('n', '[d', 'lua vim.lsp.diagnostic.goto_prev()', opts) buf_set_keymap('n', ']d', 'lua vim.lsp.diagnostic.goto_next()', opts) buf_set_keymap('n', 'q', 'lua vim.lsp.diagnostic.set_loclist()', opts) buf_set_keymap('n', 'f', 'lua vim.lsp.buf.formatting()', opts) require("lsp-status").on_attach(client) -- required for LSP status to function local basics = require("lsp_basics") -- adds nice human accessible LSP commands basics.make_lsp_commands(client, bufnr) basics.make_lsp_mappings(client, bufnr) local sources = { null_ls.builtins.formatting.gofumpt, null_ls.builtins.formatting.goimports, null_ls.builtins.formatting.isort, null_ls.builtins.formatting.black.with({ extra_args = { "-l 120" } }), null_ls.builtins.diagnostics.flake8.with({ extra_args = { "--max-line-length=120" } }), null_ls.builtins.formatting.rubocop, null_ls.builtins.formatting.rustfmt, null_ls.builtins.diagnostics.shellcheck, null_ls.builtins.formatting.stylua, } null_ls.setup({sources = sources }) end local lspServers = { bashls = {}, cssls = {}, dockerls = {}, eslint = {}, gopls = { cmd = {"gopls", "serve"}, settings = { gopls = { analyses = { unusedparams = true, }, staticcheck = true, }, }, }, html = {}, jsonls = {}, sumneko_lua = {}, jedi_language_server = {}, rust_analyzer = {}, terraformls = {}, tsserver = {}, lemminx = {}, yamlls = {} } for lspServer, opts in pairs(lspServers) do local server_available, requested_server = lsp_installer_servers.get_server(lspServer) if server_available then opts["capabilities"] = cmp_lsp.default_capabilities(vim.lsp.protocol.make_client_capabilities()) opts["on_attach"] = on_attach lspconfig[lspServer].setup(opts) if not requested_server:is_installed() then requested_server:install() end end end