local M = {} -- Simplified LSP formatting configuration local lsp_format = require("lsp-format") --- shared LSP configuration callback --- @param client native client configuration --- @param bufnr int? buffer number of the attached client M.on_attach = function(client, bufnr) -- Format on save lsp_format.on_attach(client, bufnr) -- Mappings local wk = require("which-key") local function list_workspace_folders() vim.print(vim.lsp.buf.list_workspace_folders()) end local function cycle_diagnostics_display() -- Cycle from: -- * nothing displayed -- * single diagnostic at the end of the line (`virtual_text`) -- * full diagnostics using virtual text (`virtual_lines`) local text = vim.diagnostic.config().virtual_text local lines = vim.diagnostic.config().virtual_lines -- Text -> Lines transition if text then text = false lines = true -- Lines -> Nothing transition elseif lines then text = false lines = false -- Nothing -> Text transition else text = true lines = false end vim.diagnostic.config({ virtual_text = text, virtual_lines = lines, jump = { -- Show float on jump if no diagnostic text is otherwise shown float = not (text or lines), }, }) end local function show_buffer_diagnostics() vim.diagnostic.open_float(nil, { scope = "buffer" }) end local function toggle_inlay_hints() vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) end local keys = { buffer = bufnr, -- LSP navigation { "K", vim.lsp.buf.hover, desc = "Show symbol information" }, { "", vim.lsp.buf.signature_help, desc = "Show signature information" }, { "gd", vim.lsp.buf.definition, desc = "Go to definition" }, { "gD", vim.lsp.buf.declaration, desc = "Go to declaration" }, { "gi", vim.lsp.buf.implementation, desc = "Go to implementation" }, { "gr", vim.lsp.buf.references, desc = "List all references" }, -- Code { "c", group = "Code" }, { "ca", vim.lsp.buf.code_action, desc = "Code actions" }, { "cd", cycle_diagnostics_display, desc = "Cycle diagnostics display" }, { "cD", show_buffer_diagnostics, desc = "Show buffer diagnostics" }, { "ch", toggle_inlay_hints, desc = "Toggle inlay hints" }, { "cr", vim.lsp.buf.rename, desc = "Rename symbol" }, { "cs", vim.lsp.buf.signature_help, desc = "Show signature" }, { "ct", vim.lsp.buf.type_definition, desc = "Go to type definition" }, -- Workspace { "cw", group = "Workspace" }, { "cwa", vim.lsp.buf.add_workspace_folder, desc = "Add folder to workspace" }, { "cwl", list_workspace_folders, desc = "List folders in workspace" }, { "cwr", vim.lsp.buf.remove_workspace_folder, desc = "Remove folder from workspace" }, } wk.add(keys) end return M