local lspKeys = function(client, bufnr) local options = { noremap = true, silent = false, buffer = bufnr } vim.keymap.set('n', ',', vim.diagnostic.goto_prev, vim.tbl_extend('error', options, { desc = 'Diag prev' })) vim.keymap.set('n', ';', vim.diagnostic.goto_next, vim.tbl_extend('error', options, { desc = 'Diag next' })) vim.keymap.set({ 'n', 'x' }, 'a', vim.lsp.buf.code_action, vim.tbl_extend('error', options, { desc = 'Code action' })) vim.keymap.set('n', 'e', vim.lsp.buf.declaration, vim.tbl_extend('error', options, { desc = 'Declaration' })) vim.keymap.set('n', 'h', function() vim.lsp.buf.hover({ border = 'none' }) end, vim.tbl_extend('error', options, { desc = 'Hover' })) vim.keymap.set('n', 'c', vim.lsp.buf.outgoing_calls, vim.tbl_extend('error', options, { desc = 'Outgoing calls' })) vim.keymap.set('n', 'C', vim.lsp.buf.incoming_calls, vim.tbl_extend('error', options, { desc = 'Incoming calls' })) vim.keymap.set('n', 'm', vim.lsp.buf.rename, vim.tbl_extend('error', options, { desc = 'Rename' })) vim.keymap.set('n', 'D', vim.lsp.buf.type_definition, vim.tbl_extend('error', options, { desc = 'Type definition' })) vim.keymap.set({ 'n', 'i', 'x' }, '', vim.lsp.buf.signature_help, vim.tbl_extend('error', options, { desc = 'Signature help' })) vim.keymap.set('n', 'v', function() vim.diagnostic.open_float({ border = 'rounded' }) end, vim.tbl_extend('error', options, { desc = 'Diagnostics Float' })) vim.keymap.set('n', '', 'ClangdSwitchSourceHeader', vim.tbl_extend('error', options, { desc = 'Switch Source/Header' })) if client.supports_method('inlayHintProvider') then vim.keymap.set('n', 'i', function() vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled({ bufnr = bufnr }), { bufnr = bufnr }) end, { noremap = true, silent = false, desc = 'Toggle inlay hints', buffer = bufnr, }) end end local on_attach = function(client, bufnr) vim.api.nvim_set_option_value('omnifunc', 'v:lua.vim.lsp.omnifunc', { buf = 0 }) vim.api.nvim_set_option_value('formatexpr', 'v:lua.vim.lsp.formatexpr()', { buf = 0 }) lspKeys(client, bufnr) if client.server_capabilities.documentSymbolProvider then local navic = require('nvim-navic') navic.attach(client, bufnr) end end return { 'neovim/nvim-lspconfig', dependencies = { 'williamboman/mason.nvim', 'p00f/clangd_extensions.nvim', 'Fildo7525/pretty_hover', { 'creativenull/efmls-configs-nvim', branch = 'main', }, 'SmiteshP/nvim-navic', }, version = nil, branch = 'master', config = function() local lspconfig = require('lspconfig') require('nvim-navic').setup({}) local capabilities = vim.lsp.protocol.make_client_capabilities() capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities) -- capabilities = require('blink.cmp').get_lsp_capabilities(capabilities) capabilities.workspace = { didChangeWatchedFiles = { dynamicRegistration = true, }, } require('plugins.lsp.server').setup_server(lspconfig, capabilities, on_attach) end, event = 'VeryLazy', }