local nvim_lsp = require 'lspconfig' local utils = require('utils') -- We use the default settings for ccls and pylsp: the option table can stay empty nvim_lsp.ccls.setup {} nvim_lsp.pyright.setup{} nvim_lsp.clangd.setup{} nvim_lsp.cmake.setup{} nvim_lsp.jsonls.setup{} -- Add additional capabilities supported by nvim-cmp 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.textDocument.completion.completionItem.resolveSupport = { properties = { 'documentation', 'detail', 'additionalTextEdits', }, } 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') -- Mappings. local opts = { noremap=true, silent=true } utils.map('n', ',', 'lua vim.lsp.diagnostic.goto_prev()') utils.map('n', ';', 'lua vim.lsp.diagnostic.goto_next()') utils.map('n', 'a', 'Telescope lsp_code_actions') utils.map('n', 'd', 'lua vim.lsp.buf.definition()') utils.map('n', 'e', 'lua vim.lsp.buf.declaration()') utils.map('n', 'h', 'lua vim.lsp.buf.hover()') utils.map('n', 'c', 'lua vim.lsp.buf.outgoing_calls()') utils.map('n', 'C', 'lua vim.lsp.buf.incoming_calls()') utils.map('n', 'm', 'lua vim.lsp.buf.rename()') -- utils.map('n', 'r', 'lua vim.lsp.buf.references()') utils.map('n', 's', 'lua vim.lsp.buf.document_symbol()') utils.map('n', '', 'Telescope lsp_dynamic_workspace_symbols') utils.map('n', 'D', 'lua vim.lsp.buf.type_definition()') utils.map('n', '', 'lua vim.lsp.buf.signature_help()') utils.map('n', '', ':ClangdSwitchSourceHeader') -- Set some keybinds conditional on server capabilities if client.resolved_capabilities.document_formatting then utils.map('n', 'f', 'lua vim.lsp.buf.formatting()') end if client.resolved_capabilities.document_range_formatting then utils.map('v', 'f', 'lua vim.lsp.buf.range_formatting()') 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 LspReferenceText cterm=bold ctermbg=Black guibg=DarkYellow guifg=Black 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 end -- Enable some language servers with the additional completion capabilities offered by nvim-cmp local servers = { 'clangd', 'pyright', 'cmake', 'jsonls' } for _, lsp in ipairs(servers) do nvim_lsp[lsp].setup { on_attach = on_attach, capabilities = capabilities, } end