local lspconfig = require("lspconfig") local function on_attach(client, bufnr) local opts = { noremap = true, silent = true, buffer = bufnr } local telescope_builtin = require("telescope.builtin") local cursor_theme = require("telescope.themes").get_cursor() local function cursor(callback) return function() callback(cursor_theme) end end local function desc(tbl1, description) return vim.tbl_extend("force", tbl1, { desc = description }) end vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, desc(opts, "LSP declaration")) vim.keymap.set('n', 'gd', telescope_builtin.lsp_definitions, desc(opts, "LSP Definitions")) vim.keymap.set('n', 'K', vim.lsp.buf.hover, desc(opts, "LSP Hover")) vim.keymap.set('n', 'gr', telescope_builtin.lsp_references, desc(opts, "LSP References")) vim.keymap.set('n', 'sa', cursor(telescope_builtin.lsp_code_actions), desc(opts, "LSP Code Actions")) vim.keymap.set('n', 'se', vim.diagnostic.open_float, desc(opts, "Local Diagnostics")) vim.keymap.set('n', 'sE', telescope_builtin.diagnostics, desc(opts, "Global Diagnostics")) vim.keymap.set('n', 'sl', vim.diagnostic.setloclist, desc(opts, "Diagnostics set LocList")) vim.keymap.set('n', 'sq', vim.diagnostic.setqflist, desc(opts, "Diagnostics set QFList")) vim.keymap.set('n', 'sr', vim.lsp.buf.rename, desc(opts, "LSP Rename")) vim.keymap.set('n', 'ss', telescope_builtin.lsp_document_symbols, desc(opts, "LSP Document Symbols")) vim.keymap.set('n', 'sS', telescope_builtin.lsp_workspace_symbols, desc(opts, "LSP Workspace Symbols")) vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, desc(opts, "Goto Next Diagnostic")) vim.keymap.set('n', ']d', vim.diagnostic.goto_next, desc(opts, "Goto Prev Diagnostic")) -- Capability specific if client.resolved_capabilities.document_formatting then vim.keymap.set("n", "sf", vim.lsp.buf.formatting, desc(opts, "Format buffer")) end if client.resolved_capabilities.document_range_formatting then vim.keymap.set("v", "sf", vim.lsp.buf.range_formatting, desc(opts, "Format Range")) end -- Rust specific vim.keymap.set("n", "sh", "RustToggleInlayHints", opts) require("lsp_signature").on_attach({ hint_prefix = "param: " }) end local capabilities = vim.lsp.protocol.make_client_capabilities() capabilities.textDocument.completion.completionItem.snippetSupport = true capabilities.textDocument.completion.completionItem.resolveSupport = { properties = { 'documentation', 'detail', 'additionalTextEdits', } } capabilities = require('cmp_nvim_lsp').update_capabilities(capabilities) require("rust-tools").setup { server = { cmd = { vim.g.rust_analyzer_path }, settings = { ["rust-analyzer"] = { checkOnSave = { command = "clippy", }, experimental = { procAttrMacros = true, }, }, }, on_attach = on_attach, } } require("nlua.lsp.nvim").setup(lspconfig, { cmd = { string.format("%s/bin/lua-language-server", vim.g.sumneko_lua_base_path), "-E", string.format("%s/share/lua-language-server/main.lua", vim.g.sumneko_lua_base_path), }, on_attach = on_attach, })