diff --git a/lua/plugins/lspconfig.lua b/lua/plugins/lspconfig.lua index 862bd27..5d0f785 100644 --- a/lua/plugins/lspconfig.lua +++ b/lua/plugins/lspconfig.lua @@ -1,3 +1,107 @@ +on_attach = function(client, bufnr) + 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 tele_builtins = require('telescope.builtin') + vim.keymap.set('n', ',', vim.diagnostic.goto_prev, + { noremap = true, silent = false, desc = 'Diag prev', buffer = bufnr }) + vim.keymap.set('n', ';', vim.diagnostic.goto_next, + { noremap = true, silent = false, desc = 'Diag next', buffer = bufnr }) + vim.keymap.set('n', 'a', vim.lsp.buf.code_action, + { noremap = true, silent = false, desc = 'Code action', buffer = bufnr }) + vim.keymap.set('x', 'a', vim.lsp.buf.range_code_action, + { noremap = true, silent = false, desc = 'Code action', buffer = bufnr }) + vim.keymap.set('n', 'd', tele_builtins.lsp_definitions, + { noremap = true, silent = false, desc = 'Definition', buffer = bufnr }) + vim.keymap.set('n', 'e', vim.lsp.buf.declaration, + { noremap = true, silent = false, desc = 'Declaration', buffer = bufnr }) + vim.keymap.set('n', 'h', vim.lsp.buf.hover, + { noremap = true, silent = false, desc = 'Hover', buffer = bufnr }) + vim.keymap.set('n', 'c', vim.lsp.buf.outgoing_calls, + { noremap = true, silent = false, desc = 'Outgoing calls', buffer = bufnr }) + vim.keymap.set('n', 'C', vim.lsp.buf.incoming_calls, + { noremap = true, silent = false, desc = 'Incoming calls', buffer = bufnr }) + vim.keymap.set('n', 'm', vim.lsp.buf.rename, + { noremap = true, silent = false, desc = 'Rename', buffer = bufnr }) + vim.keymap.set('n', '', tele_builtins.lsp_dynamic_workspace_symbols, + { noremap = true, silent = false, desc = 'Workspace symbols', buffer = bufnr }) + vim.keymap.set('n', 'D', vim.lsp.buf.type_definition, + { noremap = true, silent = false, desc = 'Type definition', buffer = bufnr }) + vim.keymap.set('n', '', vim.lsp.buf.signature_help, + { noremap = true, silent = false, desc = 'Signature help', buffer = bufnr }) + vim.keymap.set('n', 'r', tele_builtins.lsp_references, + { noremap = true, silent = false, desc = 'References', buffer = bufnr }) + vim.keymap.set('n', '', tele_builtins.lsp_document_symbols, + { noremap = true, silent = false, desc = 'References', buffer = bufnr }) + vim.keymap.set('n', 's', tele_builtins.lsp_dynamic_workspace_symbols, + { noremap = true, silent = false, desc = 'Workspace symbols', buffer = bufnr }) + vim.keymap.set('n', 'v', function() tele_builtins.diagnostics({ bufnr = 0 }) end, + { noremap = true, silent = false, desc = 'Diagnostics', buffer = bufnr }) + vim.keymap.set('n', '', 'ClangdSwitchSourceHeader', + { noremap = true, silent = false, desc = 'Switch Source/Header', buffer = bufnr }) + + vim.cmd([[autocmd CursorHold lua OpenDiagFloat()]]) + + -- Set some keybinds conditional on server capabilities + if client.server_capabilities.documentFormattingProvider then + vim.keymap.set('n', 'f', function() + vim.lsp.buf.format({ timeout_ms = 10000 }) + end, + { noremap = true, silent = false, desc = 'Format file', buffer = bufnr }) + end + if client.server_capabilities.documentRangeFormattingProvider then + vim.keymap.set('x', 'f', function() + vim.lsp.buf.format({ timeout_ms = 10000 }) + end, + { noremap = true, silent = false, desc = 'Format visual', buffer = bufnr }) + end + + -- Set autocommands conditional on server_capabilities + if client.server_capabilities.documentHighlightProvider then + local group = vim.api.nvim_create_augroup('lsp_document_highlight', { clear = false }) + vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, { + callback = function() + vim.lsp.buf.document_highlight() + end, + buffer = bufnr, + group = group, + desc = 'Document Highlight', + }) + vim.api.nvim_create_autocmd('CursorMoved', { + callback = function() + vim.lsp.buf.clear_references() + end, + buffer = bufnr, + group = group, + desc = 'Clear All the References', + }) + vim.api.nvim_create_autocmd({ 'LspDetach' }, { + group = group, + buffer = bufnr, + callback = function() + vim.lsp.buf.clear_references() + vim.api.nvim_clear_autocmds { + group = group, + buffer = bufnr + } + end, + }) + 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 + return { 'neovim/nvim-lspconfig', dependencies = { @@ -79,107 +183,6 @@ return { vim.diagnostic.open_float({ focusable = false, width = 80 }) end - local on_attach = function(client, bufnr) - 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 tele_builtins = require('telescope.builtin') - vim.keymap.set('n', ',', vim.diagnostic.goto_prev, - { noremap = true, silent = false, desc = 'Diag prev', buffer = bufnr }) - vim.keymap.set('n', ';', vim.diagnostic.goto_next, - { noremap = true, silent = false, desc = 'Diag next', buffer = bufnr }) - vim.keymap.set('n', 'a', vim.lsp.buf.code_action, - { noremap = true, silent = false, desc = 'Code action', buffer = bufnr }) - vim.keymap.set('n', 'd', tele_builtins.lsp_definitions, - { noremap = true, silent = false, desc = 'Definition', buffer = bufnr }) - vim.keymap.set('n', 'e', vim.lsp.buf.declaration, - { noremap = true, silent = false, desc = 'Declaration', buffer = bufnr }) - vim.keymap.set('n', 'h', vim.lsp.buf.hover, - { noremap = true, silent = false, desc = 'Hover', buffer = bufnr }) - vim.keymap.set('n', 'c', vim.lsp.buf.outgoing_calls, - { noremap = true, silent = false, desc = 'Outgoing calls', buffer = bufnr }) - vim.keymap.set('n', 'C', vim.lsp.buf.incoming_calls, - { noremap = true, silent = false, desc = 'Incoming calls', buffer = bufnr }) - vim.keymap.set('n', 'm', vim.lsp.buf.rename, - { noremap = true, silent = false, desc = 'Rename', buffer = bufnr }) - vim.keymap.set('n', '', tele_builtins.lsp_dynamic_workspace_symbols, - { noremap = true, silent = false, desc = 'Workspace symbols', buffer = bufnr }) - vim.keymap.set('n', 'D', vim.lsp.buf.type_definition, - { noremap = true, silent = false, desc = 'Type definition', buffer = bufnr }) - vim.keymap.set('n', '', vim.lsp.buf.signature_help, - { noremap = true, silent = false, desc = 'Signature help', buffer = bufnr }) - vim.keymap.set('n', 'r', tele_builtins.lsp_references, - { noremap = true, silent = false, desc = 'References', buffer = bufnr }) - vim.keymap.set('n', '', tele_builtins.lsp_document_symbols, - { noremap = true, silent = false, desc = 'References', buffer = bufnr }) - vim.keymap.set('n', 's', tele_builtins.lsp_dynamic_workspace_symbols, - { noremap = true, silent = false, desc = 'Workspace symbols', buffer = bufnr }) - vim.keymap.set('n', 'v', function() tele_builtins.diagnostics({ bufnr = 0 }) end, - { noremap = true, silent = false, desc = 'Diagnostics', buffer = bufnr }) - vim.keymap.set('n', '', 'ClangdSwitchSourceHeader', - { noremap = true, silent = false, desc = 'Switch Source/Header', buffer = bufnr }) - - vim.cmd([[autocmd CursorHold lua OpenDiagFloat()]]) - - -- Set some keybinds conditional on server capabilities - if client.server_capabilities.documentFormattingProvider then - vim.keymap.set('n', 'f', function() - vim.lsp.buf.format({ timeout_ms = 10000 }) - end, - { noremap = true, silent = false, desc = 'Format file', buffer = bufnr }) - end - if client.server_capabilities.documentRangeFormattingProvider then - vim.keymap.set('x', 'f', function() - vim.lsp.buf.format({ timeout_ms = 10000 }) - end, - { noremap = true, silent = false, desc = 'Format visual', buffer = bufnr }) - end - - -- Set autocommands conditional on server_capabilities - if client.server_capabilities.documentHighlightProvider then - local group = vim.api.nvim_create_augroup('lsp_document_highlight', { clear = false }) - vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, { - callback = function() - vim.lsp.buf.document_highlight() - end, - buffer = bufnr, - group = group, - desc = 'Document Highlight', - }) - vim.api.nvim_create_autocmd('CursorMoved', { - callback = function() - vim.lsp.buf.clear_references() - end, - buffer = bufnr, - group = group, - desc = 'Clear All the References', - }) - vim.api.nvim_create_autocmd({ 'LspDetach' }, { - group = group, - buffer = bufnr, - callback = function() - vim.lsp.buf.clear_references() - vim.api.nvim_clear_autocmds { - group = group, - buffer = bufnr - } - end, - }) - 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 lspconfig['pyright'].setup { capabilities = capabilities,