local M = {} function M.show_line_diagnostics() local opts = { focusable = false, close_events = { "BufLeave", "CursorMoved", "InsertEnter", "FocusLost" }, border = 'single' } vim.lsp.diagnostic.show_line_diagnostics(opts) end local custom_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 buf_set_option("omnifunc", "v:lua.vim.lsp.omnifunc") -- Mappings. local opts = { noremap = true, silent = true } buf_set_keymap("n", "gd", "lua vim.lsp.buf.definition()", opts) buf_set_keymap("n", "", "lua vim.lsp.buf.definition()", opts) buf_set_keymap("n", "K", "lua vim.lsp.buf.hover()", 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", "rn", "lua vim.lsp.buf.rename()", opts) buf_set_keymap("n", "gr", "lua vim.lsp.buf.references()", 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", "ca", "lua vim.lsp.buf.code_action()", opts) vim.cmd([[ autocmd CursorHold lua require('config.lsp').show_line_diagnostics() ]]) -- Set some key bindings conditional on server capabilities if client.resolved_capabilities.document_formatting then buf_set_keymap("n", "f", "lua vim.lsp.buf.formatting()", opts) end if client.resolved_capabilities.document_range_formatting then buf_set_keymap("x", "f", "lua vim.lsp.buf.range_formatting()", opts) end -- The blow command will highlight the current variable and its usages in the buffer. if client.resolved_capabilities.document_highlight then vim.cmd([[ hi link LspReferenceRead Visual hi link LspReferenceText Visual hi link LspReferenceWrite Visual augroup lsp_document_highlight autocmd! * autocmd CursorHold lua vim.lsp.buf.document_highlight() autocmd CursorMoved lua vim.lsp.buf.clear_references() augroup END ]]) end local msg = string.format("Language server %s started!", client.name) vim.api.nvim_echo({ { msg, "MoreMsg" } }, false, {}) -- vim.notify(msg, 'info', {title = 'Nvim-config', timeout = 2500}) end local capabilities = vim.lsp.protocol.make_client_capabilities() capabilities.textDocument.completion.completionItem.snippetSupport = true local lspconfig = require("lspconfig") lspconfig.pylsp.setup({ on_attach = custom_attach, settings = { pylsp = { plugins = { pylint = { enabled = true, executable = "pylint" }, pyflakes = { enabled = false }, pycodestyle = { enabled = false }, jedi_completion = { fuzzy = true }, pyls_isort = { enabled = true }, pylsp_mypy = { enabled = true }, }, }, }, flags = { debounce_text_changes = 200, }, }) -- lspconfig.pyright.setup{ -- on_attach = custom_attach, -- } lspconfig.clangd.setup({ on_attach = custom_attach, capabilities = capabilities, filetypes = { "c", "cpp", "cc" }, flags = { debounce_text_changes = 500, }, }) -- set up vim-language-server lspconfig.vimls.setup({ on_attach = custom_attach, flags = { debounce_text_changes = 500, }, }) local sumneko_binary_path = vim.fn.exepath("lua-language-server") if vim.g.is_mac or vim.g.is_linux and sumneko_binary_path ~= "" then local sumneko_root_path = vim.fn.fnamemodify(sumneko_binary_path, ":h:h:h") local runtime_path = vim.split(package.path, ";") table.insert(runtime_path, "lua/?.lua") table.insert(runtime_path, "lua/?/init.lua") require("lspconfig").sumneko_lua.setup({ on_attach = custom_attach, cmd = { sumneko_binary_path, "-E", sumneko_root_path .. "/main.lua" }, settings = { Lua = { runtime = { -- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim) version = "LuaJIT", -- Setup your lua path path = runtime_path, }, diagnostics = { -- Get the language server to recognize the `vim` global globals = { "vim" }, }, workspace = { -- Make the server aware of Neovim runtime files library = vim.api.nvim_get_runtime_file("", true), }, -- Do not send telemetry data containing a randomized but unique identifier telemetry = { enable = false, }, }, }, }) end -- Change diagnostic signs. vim.fn.sign_define("LspDiagnosticsSignError", { text = "✗", texthl = "LspDiagnosticsDefaultError" }) vim.fn.sign_define("LspDiagnosticsSignWarning", { text = "!", texthl = "LspDiagnosticsDefaultWarning" }) vim.fn.sign_define("LspDiagnosticsSignInformation", { text = "", texthl = "LspDiagnosticsDefaultInformation" }) vim.fn.sign_define("LspDiagnosticsSignHint", { text = "", texthl = "LspDiagnosticsDefaultHint" }) vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, { underline = false, virtual_text = false, signs = true, update_in_insert = false, }) -- Refs: https://github.com/neovim/nvim-lspconfig/wiki/UI-customization#show-source-in-diagnostics vim.lsp.handlers["textDocument/publishDiagnostics"] = function(_, _, params, client_id, _) local uri = params.uri local bufnr = vim.uri_to_bufnr(uri) if not bufnr then return end if not vim.api.nvim_buf_is_loaded(bufnr) then return end local diagnostics = params.diagnostics for i, v in ipairs(diagnostics) do diagnostics[i].message = string.format("%s: %s", v.source, v.message) end vim.lsp.diagnostic.save(diagnostics, bufnr, client_id) local config = { underline = false, virtual_text = false, signs = true, update_in_insert = false, } vim.lsp.diagnostic.display(diagnostics, bufnr, client_id, config) end -- The following settings works with the bleeding edge neovim. -- See https://github.com/neovim/neovim/pull/13998. vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, { border = "rounded", }) return M