local utils = require('utils') local capabilities = vim.lsp.protocol.make_client_capabilities() capabilities.textDocument.completion.completionItem.documentationFormat = { 'markdown', 'plaintext' } capabilities.textDocument.completion.completionItem.snippetSupport = true capabilities.textDocument.completion.completionItem.preselectSupport = true capabilities.textDocument.completion.completionItem.insertReplaceSupport = true capabilities.textDocument.completion.completionItem.labelDetailsSupport = true capabilities.textDocument.completion.completionItem.deprecatedSupport = true capabilities.textDocument.completion.completionItem.commitCharactersSupport = true capabilities.textDocument.completion.completionItem.tagSupport = { valueSet = { 1 } } capabilities.offsetEncoding = { 'utf-16' } capabilities.textDocument.completion.completionItem.resolveSupport = { properties = { 'documentation', 'detail', 'additionalTextEdits', }, } OpenDiagFloat = function () for _, winid in pairs(vim.api.nvim_tabpage_list_wins(0)) do if vim.api.nvim_win_get_config(winid).zindex then return end end vim.diagnostic.open_float({focusable = false}) end 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 buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc') vim.api.nvim_buf_set_option(0, 'formatexpr', 'v:lua.vim.lsp.formatexpr()') -- Mappings. local opts = { noremap = true, silent = true } buf_set_keymap('n', ',', 'lua vim.lsp.diagnostic.goto_prev()', opts) buf_set_keymap('n', ';', 'lua vim.lsp.diagnostic.goto_next()', opts) buf_set_keymap('n', 'a', 'Telescope lsp_code_actions', opts) buf_set_keymap('n', 'd', 'lua vim.lsp.buf.definition()', opts) buf_set_keymap('n', 'e', 'lua vim.lsp.buf.declaration()', opts) buf_set_keymap('n', 'h', 'lua vim.lsp.buf.hover()', opts) buf_set_keymap('n', 'c', 'lua vim.lsp.buf.outgoing_calls()', opts) buf_set_keymap('n', 'C', 'lua vim.lsp.buf.incoming_calls()', opts) buf_set_keymap('n', 'm', 'lua vim.lsp.buf.rename()', opts) -- buf_set_keymap('n', 'r', 'lua vim.lsp.buf.references()') buf_set_keymap('n', 's', 'lua vim.lsp.buf.document_symbol()', opts) buf_set_keymap('n', '', 'Telescope lsp_dynamic_workspace_symbols', opts) buf_set_keymap('n', 'D', 'lua vim.lsp.buf.type_definition()', opts) buf_set_keymap('n', '', 'lua vim.lsp.buf.signature_help()', opts) buf_set_keymap('n', 'r', 'Telescope lsp_references', opts) buf_set_keymap('n', '', 'Telescope lsp_document_symbols', opts) buf_set_keymap('n', '', 'Telescope lsp_document_symbols', opts) buf_set_keymap('n', 'v', 'Telescope diagnostics bufnr=0', opts) buf_set_keymap('n', '', ':ClangdSwitchSourceHeader', opts) vim.cmd([[autocmd CursorHold lua OpenDiagFloat()]]) -- Set some keybinds 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('v', 'f', 'lua vim.lsp.buf.range_formatting()', opts) end -- Set autocommands conditional on server_capabilities if client.resolved_capabilities.document_highlight then vim.api.nvim_exec( [[ hi LspReferenceRead cterm=bold ctermbg=red guibg=DarkGreen hi LspReferenceWrite cterm=bold ctermbg=red guibg=DarkRed augroup lsp_document_highlight autocmd! * autocmd CursorHold lua vim.lsp.buf.document_highlight() autocmd CursorHoldI lua vim.lsp.buf.document_highlight() autocmd CursorMoved lua vim.lsp.buf.clear_references() augroup END ]], false ) end require('lsp_signature').on_attach({ bind = true, -- This is mandatory, otherwise border config won't get registered. handler_opts = { border = 'single', }, hi_parameter = 'IncSearch', }, bufnr) end local lsp_installer = require('nvim-lsp-installer') local servers = { 'pyright', 'cmake', 'clangd', 'jsonls', 'sumneko_lua', 'dockerls', } for _, name in pairs(servers) do local server_is_found, server = lsp_installer.get_server(name) if server_is_found then if not server:is_installed() then print('Installing ' .. name) server:install() end end end lsp_installer.on_server_ready(function(server) local opts = { on_attach = on_attach, capabilities = capabilities, } -- (optional) Customize the options passed to the server if server.name == 'clangd' then return end -- This setup() function is exactly the same as lspconfig's setup function (:help lspconfig-quickstart) server:setup(opts) vim.cmd([[ do User LspAttachBuffers ]]) end) local null_ls = require('null-ls') null_ls.setup({ sources = { null_ls.builtins.code_actions.gitsigns, null_ls.builtins.formatting.autopep8, null_ls.builtins.formatting.prettier, null_ls.builtins.formatting.stylua, null_ls.builtins.diagnostics.flake8, null_ls.builtins.formatting.isort, null_ls.builtins.formatting.cmake_format, }, on_attach = on_attach, capabilities = capabilities, }) vim.diagnostic.config({ virtual_text = false }) require('clangd_extensions').setup({ server = { on_attach = on_attach, capabilities = capabilities, cmd = { 'clangd', '--compile-commands-dir=build_nvim' } }, })