local status_ok, lspconfig = pcall(require, "lspconfig") if not status_ok then return end local signs = { { name = "DiagnosticSignError", text = "" }, { name = "DiagnosticSignWarn", text = "" }, { name = "DiagnosticSignHint", text = "" }, { name = "DiagnosticSignInfo", text = "" }, } for _, sign in ipairs(signs) do vim.fn.sign_define(sign.name, { texthl = sign.name, text = sign.text, numhl = "" }) end local config = { virtual_text = false, signs = { active = signs, }, update_in_insert = true, underline = true, severity_sort = true, float = { focusable = false, style = "minimal", border = "none", -- max_width = 80, source = "always", header = "", prefix = "", }, } -- TODO set this up when upgrading to Neovim v0.8 local navic = require('nvim-navic') vim.diagnostic.config(config) vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, { border = "rounded", }) local capabilities = vim.lsp.protocol.make_client_capabilities() local status_ok, cmp_nvim_lsp = pcall(require, "cmp_nvim_lsp") if not status_ok then return end capabilities = cmp_nvim_lsp.default_capabilities(capabilities) local opts = { noremap=true, silent=true } vim.keymap.set('n', 'gl', vim.diagnostic.open_float, opts) vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts) vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts) vim.keymap.set('n', 'q', vim.diagnostic.setloclist, opts) local on_attach = function(client, bufnr) -- Enable completion triggered by vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc') -- Mappings. -- See `:help vim.lsp.*` for documentation on any of the below functions local bufopts = { noremap=true, silent=true, buffer=bufnr } vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts) vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts) vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts) vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts) vim.keymap.set('n', '', vim.lsp.buf.signature_help, bufopts) vim.keymap.set('n', 'wa', vim.lsp.buf.add_workspace_folder, bufopts) vim.keymap.set('n', 'wr', vim.lsp.buf.remove_workspace_folder, bufopts) vim.keymap.set('n', 'wl', function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end, bufopts) vim.keymap.set('n', 'D', vim.lsp.buf.type_definition, bufopts) vim.keymap.set('n', 'rn', vim.lsp.buf.rename, bufopts) vim.keymap.set('n', 'ca', vim.lsp.buf.code_action, bufopts) vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts) vim.keymap.set('n', ']', "lua vim.lsp.buf.format({async = true})", bufopts) -- TODO set this up when upgrading to Neovim v0.8 if client.server_capabilities.documentSymbolProvider then navic.attach(client, bufnr) end end lspconfig.pyright.setup{ capabilities = capabilities, on_attach = on_attach, settings = { python = { analysis = { typeCheckingMode = "off" } } } } lspconfig.gopls.setup{ capabilities = capabilities, on_attach = on_attach } lspconfig.tsserver.setup{ capabilities = capabilities, on_attach = on_attach, } lspconfig.jsonls.setup{ capabilities = capabilities, on_attach = on_attach, } lspconfig.ccls.setup{ capabilities = capabilities, on_attach = on_attach, } lspconfig.lua_ls.setup { capabilities = capabilities, on_attach = on_attach, on_init = function(client) local path = client.workspace_folders[1].name if not vim.loop.fs_stat(path..'/.luarc.json') and not vim.loop.fs_stat(path..'/.luarc.jsonc') then client.config.settings = vim.tbl_deep_extend('force', client.config.settings, { Lua = { runtime = { -- Tell the language server which version of Lua you're using -- (most likely LuaJIT in the case of Neovim) version = 'LuaJIT' }, -- Make the server aware of Neovim runtime files workspace = { checkThirdParty = false, library = { vim.env.VIMRUNTIME -- "${3rd}/luv/library" -- "${3rd}/busted/library", } -- or pull in all of 'runtimepath'. NOTE: this is a lot slower -- library = vim.api.nvim_get_runtime_file("", true) } } }) client.notify("workspace/didChangeConfiguration", { settings = client.config.settings }) end return true end } -- lspconfig.terraformls.setup{ -- capabilities = capabilities, -- on_attach = on_attach, -- } -- local null_ls = require("null-ls") null_ls.setup({ debug = false, on_attach = on_attach, sources = { -- (java|type)script null_ls.builtins.formatting.prettierd, -- python null_ls.builtins.formatting.black.with({extra_args={"--fast"}}), null_ls.builtins.formatting.isort.with({extra_args={"--profile", "black"}}), null_ls.builtins.diagnostics.flake8.with({ condition = function(utils) return utils.root_has_file({".flake8"}) end, }), null_ls.builtins.diagnostics.mypy.with({ condition = function(utils) return utils.root_has_file({"pyproject.toml"}) end, }), }, })