local r = require("utils.remaps") local vim = vim local M = {} local function generate_buf_keymapper(bufnr) return function(type, input, output, description, extraOptions) local options = { buffer = bufnr } if extraOptions ~= nil then options = vim.tbl_deep_extend("force", options, extraOptions) end r.noremap(type, input, output, description, options) end end function M.set_default_on_buffer(client, bufnr) local buf_set_keymap = generate_buf_keymapper(bufnr) local filetype = vim.api.nvim_buf_get_option(bufnr or 0, "filetype") local is_typescript = filetype == "typescript" or filetype == "typescriptreact" local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end local cap = client.server_capabilities buf_set_option("omnifunc", "v:lua.vim.lsp.omnifunc") -- gives definition & references -- buf_set_keymap('n','tt', 'lua vim.lsp.buf.type_definition()', opts) if cap.definitionProvider then buf_set_keymap("n", "gd", vim.lsp.buf.definition, "Preview definition") end -- if cap.declarationProvider then -- map('n', 'gd', 'lua vim.lsp.buf.declaration()', opts) -- end if cap.implementationProvider then buf_set_keymap("n", "gi", vim.lsp.buf.implementation, "Go to implementation") buf_set_keymap("n", "gI", function() require("fzf-lua").lsp_implementations() end, "Search implementations") end if cap.referencesProvider then buf_set_keymap("n", "gr", function() require("fzf-lua").lsp_references() end, "Show references") end if cap.hoverProvider then buf_set_keymap("n", "K", vim.lsp.buf.hover, "Hover documentation") end if cap.documentSymbolProvider then -- buf_set_keymap('n','to', 'lua vim.lsp.buf.document_symbol()', opts) buf_set_keymap("n", "tO", function() require("fzf-lua").lsp_document_symbols() end, "Document symbols") if pcall(require, "aerial") then buf_set_keymap("n", "to", "AerialToggle!", "(Aerial) Document symbols") end end buf_set_keymap("n", "ts", vim.lsp.buf.signature_help, "Show signature") buf_set_keymap("n", "te", function() require("fzf-lua").diagnostics_document() end, "Show diagnostics") buf_set_keymap("n", "tE", vim.diagnostic.open_float, "Show line diagnostics") -- if cap.workspaceSymbolProvider then -- map('n','gW','lua vim.lsp.buf.workspace_symbol()', opts) -- end if cap.codeActionProvider then buf_set_keymap({ "n", "v" }, "ra", vim.lsp.buf.code_action, "Code actions") buf_set_keymap({ "n", "v" }, "rA", function() local line_count = vim.api.nvim_buf_line_count(bufnr) --[[ local range = vim.lsp.util.make_given_range_params({ 1, 1 }, { line_count, 1 }, bufnr) ]] local range = { start = { line = 1, character = 1 }, ["end"] = { line = line_count, character = 1 }, } vim.lsp.buf.code_action({ range = range.range }) end, "Buffer code actions") end -- when sumneko lua will be able to format we can reput the capabilities -- if cap.documentFormattingProvider then buf_set_keymap("n", "rf", function() vim.lsp.buf.format({ async = true, bufnr = bufnr, filter = function(format_client) if is_typescript then if format_client.name == "null-ls" then --[[ vim.notify("format " .. filetype .. " with " .. format_client.name) ]] return true else return false end end --[[ vim.notify("format " .. filetype .. " with " .. format_client.name) ]] return true end, }) end, "Format") -- elseif cap.documentRangeFormattingProvider then -- buf_set_keymap("n", "tf", vim.lsp.buf.formatting, "lsp_range_format", "Format") -- end r.which_key("ri", "import") if is_typescript then buf_set_keymap("n", "rio", function() local typescript = require("typescript") typescript.actions.organizeImports() end, "Organize imports (TS)") buf_set_keymap("n", "riu", function() local typescript = require("typescript") typescript.actions.removeUnused() end, "Remove unused variables (TS)") buf_set_keymap("n", "rim", function() local typescript = require("typescript") typescript.actions.addMissingImports() end, "Import all (TS)") end if cap.renameProvider then -- buf_set_keymap("n", "rr", vim.lsp.buf.rename, "Rename") buf_set_keymap("n", "rr", ":IncRename ", "Rename") -- function() return ":IncRename " .. vim.fn.expand("") end, desc = "Rename", expr = true }, end buf_set_keymap("n", "lsc", function() print(vim.inspect(vim.lsp.get_active_clients())) end, "LSP clients") buf_set_keymap("n", "lsl", function() print(vim.lsp.get_log_path()) end, "Show log path") buf_set_keymap("n", "lsa", ":LspInfo()", "LSP Info") buf_set_keymap("n", "lt", function() if vim.diagnostic.is_disabled() then vim.diagnostic.enable() else vim.diagnostic.disable() end end, "toggle LSP") buf_set_keymap("n", "le", function() vim.diagnostic.enable() end, "enable LSP") buf_set_keymap("n", "ld", function() vim.diagnostic.disable() end, "disable LSP") end r.which_key("ls", "LSP servers") r.noremap("n", "lsi", "LspInstallInfo", "LSP servers install info") return M