local set = vim.keymap.set ---@param mode string|table ---@param keymap string local function unbind(mode, keymap) set(mode, keymap, function() end) end local function toggle_zen() vim.cmd('Neotree close') vim.cmd('Trouble todo close') vim.cmd('UndotreeHide') end local function yank_filepath_to_clipboard(absolute) return function() local filepath = vim.fn.expand('%:p') if not absolute then local home_dir = vim.fn.expand('~') filepath = filepath:gsub(home_dir, '~') end vim.fn.setreg('+', filepath) end end local function paste() local value = vim.fn.getreg('+') if vim.fn.mode() == 'c' then -- value = vim.split(value, '\n')[1] -- only use first line (default with normal pasting) value = value:gsub('\n', ' ') -- replace newlines with spaces vim.api.nvim_feedkeys(value, 'c', false) else vim.api.nvim_put(vim.split(value, '\n'), 'c', false, true) end end -- "Greatest Keymap ever" - ThePrimeagen -- https://www.youtube.com/watch?v=qZO9A5F6BZs&list=PLm323Lc7iSW_wuxqmKx_xxNtJC_hJbQ7R&index=4 set('x', 'p', '"_dP') set('n', '!', ':!') -- Move lines around set('n', '', ':m .+1', { noremap = true }) set('n', '', ':m .-2', { noremap = true }) set('v', '', ":m '>+1gv", { noremap = true }) set('v', '', ":m '<-2gv", { noremap = true }) -- Misc set({ 'n', 'i' }, '', 'ggVG', { desc = 'Visually Highlight [A]ll' }) set('i', '', '', { desc = 'Ctrl + Backspace to delete word' }) set('n', '', 'nohlsearch', { silent = true }) set({ 'i', 'c' }, '', paste) set('n', 'z', toggle_zen, { desc = '[Z]en Mode', silent = true }) set('n', '', 'e #', { desc = 'Switch to Other Buffer' }) unbind({ 'i', 'n', 'v' }, '') set('n', 'U', 'redo') set('i', '', 'undo') set({ 'i', 'n', 'v' }, '', 'wqa') set('n', 'yp', yank_filepath_to_clipboard(true), { desc = '[Y]oink File [P]ath (linux)' }) set('n', 'yP', yank_filepath_to_clipboard(false), { desc = '[Y]oink File [P]ath (windows)' }) -- Terminal set('t', '', 'close', { desc = 'Hide Terminal' }) -- Window resizing local resize = 2 set({ 'n', 't' }, '', string.format('vertical resize -%d', resize), { desc = 'Resize Left' }) set({ 'n', 't' }, '', string.format('resize -%d', resize), { desc = 'Resize Up' }) set({ 'n', 't' }, '', string.format('resize +%d', resize), { desc = 'Resize Down' }) set({ 'n', 't' }, '', string.format('vertical resize +%d', resize), { desc = 'Resize Right' }) -- highlights under cursor set('n', 'ui', vim.show_pos, { desc = 'Inspect Pos' }) set('n', 'uI', function() vim.treesitter.inspect_tree() vim.api.nvim_input('I') end, { desc = 'Inspect Tree' }) -- Keep selection after < and > in visual mode set('v', '<', '', '>gv') -- Execute lua file or line set('n', 'x', '.lua', { desc = 'Execute the current line' }) set('n', 'x', 'source %', { desc = 'Execute the current file' }) -- Reformats file using lsp set('n', '=', vim.lsp.buf.format, { desc = 'Format File' }) -- LSP keymaps local severity = vim.diagnostic.severity local function next_diagnostic(diagnostic_severity) return function() require('lspsaga.diagnostic'):goto_next({ severity = diagnostic_severity }) end end local function prev_diagnostic(diagnostic_severity) return function() require('lspsaga.diagnostic'):goto_prev({ severity = diagnostic_severity }) end end local function cursor_diagnostics() vim.diagnostic.open_float({ scope = 'cursor', border = 'single', }) end local keymaps = { { 'n', 'gd', 'Lspsaga goto_definition', { desc = '[G]oto [D]efinition' } }, { 'n', 'gu', 'Lspsaga finder', { desc = '[G]oto [U]sages' } }, { { 'n', 'i' }, '', vim.lsp.buf.signature_help, { desc = 'Show [P]arameters' } }, { 'n', 'K', 'Lspsaga hover_doc', { desc = 'Documentation' } }, { 'n', 'R', 'Lspsaga rename', { desc = '[R]ename' } }, { { 'n', 'i' }, '', 'Lspsaga code_action', { desc = 'Code Actions' } }, { 'n', 'e', next_diagnostic(severity.ERROR), { desc = 'Goto [E]rror' } }, { 'n', 'E', prev_diagnostic(severity.ERROR), { desc = 'Goto [E]rror (prev)' } }, { 'n', 'w', next_diagnostic(severity.WARN), { desc = 'Goto [W]arning' } }, { 'n', 'W', prev_diagnostic(severity.WARN), { desc = 'Goto [W]arning (prev)' } }, { 'n', 'D', cursor_diagnostics, { desc = '[D]iagnostics under cursor' } }, } local function set_keymaps(tbl, bufnr) for _, keymap in ipairs(tbl) do local mode = keymap[1] local lhs = keymap[2] local rhs = keymap[3] local opts = keymap[4] or {} opts.buffer = bufnr vim.keymap.set(mode, lhs, rhs, opts) end end vim.api.nvim_create_autocmd('LspAttach', { desc = 'Register LSP keymaps', group = vim.api.nvim_create_augroup('lsp-keymaps', { clear = true }), callback = function(args) local bufnr = args.buf local filetype = vim.bo[bufnr].filetype set_keymaps(keymaps, bufnr) for ft, tbl in pairs(keymaps) do if type(ft) == 'number' or ft ~= filetype then goto continue end set_keymaps(tbl, bufnr) ::continue:: end end, })