local fn = vim.fn local api = vim.api local lsp = vim.lsp local utils = require("utils") local custom_attach = function(client, bufnr) -- Mappings. local opts = { silent = true, buffer = bufnr } vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts) vim.keymap.set("n", "", vim.lsp.buf.definition, opts) vim.keymap.set("n", "K", vim.lsp.buf.hover, opts) vim.keymap.set("n", "", vim.lsp.buf.signature_help, opts) vim.keymap.set("n", "wa", vim.lsp.buf.add_workspace_folder, opts) vim.keymap.set("n", "wr", vim.lsp.buf.remove_workspace_folder, opts) vim.keymap.set("n", "wl", function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end, opts) vim.keymap.set("n", "rn", vim.lsp.buf.rename, opts) vim.keymap.set("n", "gr", vim.lsp.buf.references, 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", function() vim.diagnostic.setqflist({open = true}) end, opts) vim.keymap.set("n", "ca", vim.lsp.buf.code_action, opts) vim.api.nvim_create_autocmd("CursorHold", { buffer=bufnr, callback = function() local opts = { focusable = false, close_events = { "BufLeave", "CursorMoved", "InsertEnter", "FocusLost" }, border = 'rounded', source = 'always', -- show source in diagnostic popup window prefix = ' ' } if not vim.b.diagnostics_pos then vim.b.diagnostics_pos = { nil, nil } end local cursor_pos = vim.api.nvim_win_get_cursor(0) if (cursor_pos[1] ~= vim.b.diagnostics_pos[1] or cursor_pos[2] ~= vim.b.diagnostics_pos[2]) and #vim.diagnostic.get() > 0 then vim.diagnostic.open_float(nil, opts) end vim.b.diagnostics_pos = cursor_pos end }) -- Set some key bindings conditional on server capabilities if client.resolved_capabilities.document_formatting then vim.keymap.set("n", "f", vim.lsp.buf.formatting_sync, opts) end if client.resolved_capabilities.document_range_formatting then vim.keymap.set("x", "f", 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 if vim.g.logging_level == 'debug' then local msg = string.format("Language server %s started!", client.name) vim.notify(msg, 'info', {title = 'Nvim-config'}) end end local capabilities = lsp.protocol.make_client_capabilities() capabilities = require('cmp_nvim_lsp').update_capabilities(capabilities) capabilities.textDocument.completion.completionItem.snippetSupport = true local lspconfig = require("lspconfig") if utils.executable('pylsp') then 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, }, capabilities = capabilities, }) else vim.notify("pylsp not found!", 'warn', {title = 'Nvim-config'}) end -- if utils.executable('pyright') then -- lspconfig.pyright.setup{ -- on_attach = custom_attach, -- capabilities = capabilities -- } -- else -- vim.notify("pyright not found!", 'warn', {title = 'Nvim-config'}) -- end if utils.executable('clangd') then lspconfig.clangd.setup({ on_attach = custom_attach, capabilities = capabilities, filetypes = { "c", "cpp", "cc" }, flags = { debounce_text_changes = 500, }, }) else vim.notify("clangd not found!", 'warn', {title = 'Nvim-config'}) end -- set up vim-language-server if utils.executable('vim-language-server') then lspconfig.vimls.setup({ on_attach = custom_attach, flags = { debounce_text_changes = 500, }, capabilities = capabilities, }) else vim.notify("vim-language-server not found!", 'warn', {title = 'Nvim-config'}) end -- set up bash-language-server if utils.executable('bash-language-server') then lspconfig.bashls.setup({ on_attach = custom_attach, capabilities = capabilities, }) end local sumneko_binary_path = fn.exepath("lua-language-server") if vim.g.is_mac or vim.g.is_linux and sumneko_binary_path ~= "" then local sumneko_root_path = 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") 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 = api.nvim_get_runtime_file("", true), }, -- Do not send telemetry data containing a randomized but unique identifier telemetry = { enable = false, }, }, }, capabilities = capabilities, }) end -- Change diagnostic signs. fn.sign_define("DiagnosticSignError", { text = "✗", texthl = "DiagnosticSignError" }) fn.sign_define("DiagnosticSignWarn", { text = "!", texthl = "DiagnosticSignWarn" }) fn.sign_define("DiagnosticSignInformation", { text = "", texthl = "DiagnosticSignInfo" }) fn.sign_define("DiagnosticSignHint", { text = "", texthl = "DiagnosticSignHint" }) -- global config for diagnostic vim.diagnostic.config({ underline = false, virtual_text = false, signs = true, severity_sort = true, }) -- lsp.handlers["textDocument/publishDiagnostics"] = lsp.with(lsp.diagnostic.on_publish_diagnostics, { -- underline = false, -- virtual_text = false, -- signs = true, -- update_in_insert = false, -- }) -- Change border of documentation hover window, See https://github.com/neovim/neovim/pull/13998. lsp.handlers["textDocument/hover"] = lsp.with(vim.lsp.handlers.hover, { border = "rounded", })