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.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()', opts) utils.map('n', ';', 'lua vim.lsp.diagnostic.goto_next()', opts) utils.map('n', 'a', 'Telescope lsp_code_actions', opts) utils.map('n', 'd', 'lua vim.lsp.buf.definition()', opts) utils.map('n', 'e', 'lua vim.lsp.buf.declaration()', opts) utils.map('n', 'h', 'lua vim.lsp.buf.hover()', opts) utils.map('n', 'c', 'lua vim.lsp.buf.outgoing_calls()', opts) utils.map('n', 'C', 'lua vim.lsp.buf.incoming_calls()', opts) utils.map('n', 'm', 'lua vim.lsp.buf.rename()', opts) -- utils.map('n', 'r', 'lua vim.lsp.buf.references()') utils.map('n', 's', 'lua vim.lsp.buf.document_symbol()', opts) utils.map('n', '', 'Telescope lsp_dynamic_workspace_symbols', opts) utils.map('n', 'D', 'lua vim.lsp.buf.type_definition()', opts) utils.map('n', '', 'lua vim.lsp.buf.signature_help()', opts) utils.map('n', 'r', 'Telescope lsp_references') utils.map('n', '', 'Telescope lsp_document_symbols') utils.map('n', '', 'Telescope lsp_document_symbols') utils.map('n', 'v', 'Telescope lsp_document_diagnostics') utils.map('n', '', ':ClangdSwitchSourceHeader', opts) -- Set some keybinds conditional on server capabilities if client.resolved_capabilities.document_formatting then utils.map('n', 'f', 'lua vim.lsp.buf.formatting()', opts) end if client.resolved_capabilities.document_range_formatting then utils.map('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 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 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") 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 == "tsserver" then -- opts.root_dir = function() ... end -- 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)