local lspconfig = require "lspconfig" local function on_attach(client, bufnr) vim.api.nvim_buf_set_option(bufnr, "omnifunc", "v:lua.vim.lsp.omnifunc") vim.api.nvim_buf_set_var(bufnr, "vcm_tab_complete", "omni") local function command(name, command) vim.api.nvim_buf_create_user_command(bufnr, name, command, {}) end local function map(mode, lhs, rhs) vim.keymap.set(mode, lhs, rhs, { buffer = bufnr }) end local augroup_id = vim.api.nvim_create_augroup("LSPAttach", { clear = false }) local function autocmd(event, callback) vim.api.nvim_create_autocmd(event, { group = augroup_id, buffer = bufnr, callback = callback }) end vim.api.nvim_clear_autocmds({ buffer = bufnr, group = augroup_id }) command("References", function() local function on_list(options) vim.fn.setqflist({}, "r", options) vim.api.nvim_command("cfirst") end vim.lsp.buf.references(nil, { on_list = on_list }) end) map("n", "gD", vim.lsp.buf.declaration) map("n", "gd", vim.lsp.buf.definition) map("n", "K", vim.lsp.buf.hover) map("n", "", vim.lsp.buf.signature_help) map("n", "lc", vim.lsp.buf.code_action) map("n", "li", vim.lsp.buf.implementation) map("n", "lr", vim.lsp.buf.rename) autocmd("CursorHold", function() vim.lsp.buf.document_highlight() vim.diagnostic.open_float({ bufnr = bufnr }, { focus = false }) end) autocmd("CursorMoved", vim.lsp.buf.clear_references) end local settings = { clangd = { cmd = {"clangd", "--background-index", "--suggest-missing-includes", "--clang-tidy", "--header-insertion=iwyu"} } } local lsp = {} function lsp.initialize() vim.diagnostic.config({ float = { focusable = false } }) for lss, lss_params in pairs(settings) do local params = { on_attach = on_attach, handlers = { ["textDocument/publishDiagnostics"] = vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, { signs = false, virtual_text = false, underline = true }), ["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, { silent = true, focusable = false }), ["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, { focusable = false }) } } lspconfig[lss].setup(vim.tbl_deep_extend("force", params, lss_params)) end end return lsp