local on_attach = function(_, bufnr) local nmap = function(keys, func, desc) if desc then desc = 'LSP: ' .. desc end vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc }) end nmap('rn', vim.lsp.buf.rename, '[R]e[n]ame') nmap('ca', vim.lsp.buf.code_action, '[C]ode [A]ction') nmap('gd', require('telescope.builtin').lsp_definitions, '[G]oto [D]efinition') nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences') nmap('gI', require('telescope.builtin').lsp_implementations, '[G]oto [I]mplementation') nmap('D', require('telescope.builtin').lsp_type_definitions, 'Type [D]efinition') nmap('ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols') nmap('ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols') -- See `:help K` for why this keymap nmap('K', vim.lsp.buf.hover, 'Hover Documentation') nmap('', vim.lsp.buf.signature_help, 'Signature Documentation') -- Lesser used LSP functionality nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') nmap('wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder') nmap('wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder') nmap('wl', function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end, '[W]orkspace [L]ist Folders') -- Create a command `:Format` local to the LSP buffer vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_) if vim.lsp.buf.format then vim.lsp.buf.format() elseif vim.lsp.buf.formatting then vim.lsp.buf.formatting() end end, { desc = 'Format current buffer with LSP' }) end -- LSP Diagnostics Options Setup local sign = function(opts) vim.fn.sign_define(opts.name, { texthl = opts.name, text = opts.text, numhl = '' }) end sign({ name = 'DiagnosticSignError', text = '' }) sign({ name = 'DiagnosticSignWarn', text = '' }) sign({ name = 'DiagnosticSignHint', text = '' }) sign({ name = 'DiagnosticSignInfo', text = '' }) vim.diagnostic.config({ virtual_text = false, signs = true, update_in_insert = true, underline = true, severity_sort = false, float = { border = 'rounded', source = 'always', header = '', prefix = '', }, }) vim.cmd([[ autocmd CursorHold * lua vim.diagnostic.open_float(nil, { focusable = false }) ]]) -- LSP Configuration local capabilities = vim.lsp.protocol.make_client_capabilities() capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities) require('neodev').setup({ override = function(root_dir, library) if root_dir:find("/home/kalle/.dots", 1, true) == 1 then library.enabled = true library.plugins = true end end, }) require('lspconfig').lua_ls.setup { on_attach = on_attach, capabilities = capabilities, root_dir = function() return vim.loop.cwd() end, cmd = { "lua-language-server" }, settings = { Lua = { workspace = { checkThirdParty = false }, telemetry = { enable = false }, }, } } require('lspconfig').rnix.setup { on_attach = on_attach, capabilities = capabilities, } require('lspconfig').tsserver.setup { on_attach = on_attach, capabilities = capabilities, } require('lspconfig').tailwindcss.setup { on_attach = on_attach, capabilities = capabilities, } require('lspconfig').clangd.setup { on_attach = on_attach, capabilities = capabilities, } require('rust-tools').setup({ server = { on_attach = on_attach, settings = { ["rust-analyzer"] = { checkOnSave = { command = "clippy" }, }, } }, }) require 'vscoq'.setup { -- Configuration for vscoq, used in both the client and the server. -- See "configuration" in https://github.com/coq-community/vscoq/blob/main/client/package.json. -- The following is an example. vscoq = { proof = { mode = 1, -- automatic mode }, }, -- The configuration forwarded to `:help lspconfig-setup`. -- The following is an example. lsp = { on_attach = on_attach, }, }