-- Keymaps for better default experience -- Set leader key vim.g.mapleader = ' ' vim.g.maplocalleader = ' ' -- For conciseness local opts = { noremap = true, silent = true } -- Disable the spacebar key's default behavior in Normal and Visual modes vim.keymap.set({ 'n', 'v' }, '', '', { silent = true }) -- Allow moving the cursor through wrapped lines with j, k vim.keymap.set('n', 'k', "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true }) vim.keymap.set('n', 'j', "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true }) -- clear highlights vim.keymap.set('n', '', ':noh', opts) -- save file vim.keymap.set('n', '', ' w ', opts) -- save file without auto-formatting vim.keymap.set('n', 'sn', 'noautocmd w ', opts) -- quit file vim.keymap.set('n', '', ' q ', opts) -- delete single character without copying into register vim.keymap.set('n', 'x', '"_x', opts) -- Vertical scroll and center vim.keymap.set('n', '', 'zz', opts) vim.keymap.set('n', '', 'zz', opts) -- Find and center vim.keymap.set('n', 'n', 'nzzzv') vim.keymap.set('n', 'N', 'Nzzzv') -- Resize with arrows vim.keymap.set('n', '', ':resize -2', opts) vim.keymap.set('n', '', ':resize +2', opts) vim.keymap.set('n', '', ':vertical resize -2', opts) vim.keymap.set('n', '', ':vertical resize +2', opts) -- Buffers vim.keymap.set('n', '', ':bnext', opts) vim.keymap.set('n', '', ':bprevious', opts) vim.keymap.set('n', 'x', ':Bdelete!', opts) -- close buffer vim.keymap.set('n', 'b', ' enew ', opts) -- new buffer -- Increment/decrement numbers vim.keymap.set('n', '+', '', opts) -- increment vim.keymap.set('n', '-', '', opts) -- decrement -- Window management vim.keymap.set('n', 'v', 'v', opts) -- split window vertically vim.keymap.set('n', 'h', 's', opts) -- split window horizontally vim.keymap.set('n', 'se', '=', opts) -- make split windows equal width & height vim.keymap.set('n', 'xs', ':close', opts) -- close current split window -- Navigate between splits vim.keymap.set('n', '', ':wincmd k', opts) vim.keymap.set('n', '', ':wincmd j', opts) vim.keymap.set('n', '', ':wincmd h', opts) vim.keymap.set('n', '', ':wincmd l', opts) -- Tabs vim.keymap.set('n', 'to', ':tabnew', opts) -- open new tab vim.keymap.set('n', 'tx', ':tabclose', opts) -- close current tab vim.keymap.set('n', 'tn', ':tabn', opts) -- go to next tab vim.keymap.set('n', 'tp', ':tabp', opts) -- go to previous tab -- Toggle line wrapping vim.keymap.set('n', 'lw', 'set wrap!', opts) -- Press jk fast to exit insert mode vim.keymap.set('i', 'jk', '', opts) vim.keymap.set('i', 'kj', '', opts) -- Stay in indent mode vim.keymap.set('v', '<', '', '>gv', opts) -- Move text up and down vim.keymap.set('v', '', ':m .+1==', opts) vim.keymap.set('v', '', ':m .-2==', opts) -- Keep last yanked when pasting vim.keymap.set('v', 'p', '"_dP', opts) -- Replace word under cursor vim.keymap.set('n', 'j', '*``cgn', opts) -- Explicitly yank to system clipboard (highlighted and entire row) vim.keymap.set({ 'n', 'v' }, 'y', [["+y]]) vim.keymap.set('n', 'Y', [["+Y]]) -- Toggle diagnostics local diagnostics_active = true vim.keymap.set('n', 'do', function() diagnostics_active = not diagnostics_active if diagnostics_active then vim.diagnostic.enable(0) else vim.diagnostic.disable(0) end end) -- Diagnostic keymaps vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Go to previous diagnostic message' }) vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Go to next diagnostic message' }) vim.keymap.set('n', 'd', vim.diagnostic.open_float, { desc = 'Open floating diagnostic message' }) vim.keymap.set('n', 'q', vim.diagnostic.setloclist, { desc = 'Open diagnostics list' }) -- Save and load session vim.keymap.set('n', 'ss', ':mksession! .session.vim', { noremap = true, silent = false }) vim.keymap.set('n', 'sl', ':source .session.vim', { noremap = true, silent = false }) -- exit insrrt mode with jk vim.keymap.set('i', 'jk', '', { noremap = true, silent = true, desc = '' }) -- -- option + a to select all text in a file vim.keymap.set('n', '', 'ggVG', { noremap = true, silent = true, desc = 'Select all' }) -- -- Map the function to a key combination vim.keymap.set('n', 'te', 'oif err != nil {}Oreturn err') -- -- -- Remap x to close the current buffer vim.api.nvim_set_keymap('n', 'x', ':bd', { noremap = true, silent = true }) -- vim.api.nvim_del_keymap('n', 'l') -- Function to restart LSP vim.api.nvim_set_keymap('n', 'L', ':LspRestart', { noremap = true, silent = true }) -- -- Remap l to restart LSP vim.api.nvim_set_keymap('n', 'l', 'lua restart_lsp()', { noremap = true, silent = true }) -- Remap leader+f to leader+F vim.api.nvim_set_keymap('n', '', 'fF', { noremap = true, silent = true }) vim.api.nvim_set_keymap('n', 'ff', 'fF', { noremap = true, silent = true }) vim.api.nvim_set_keymap('n', 'ft', 'fT', { noremap = true, silent = true }) vim.keymap.set('n', '', '20j', { noremap = true, silent = true }) vim.keymap.set('n', '', '20k', { noremap = true, silent = true }) -- diagnostic local diagnostic_goto = function(next, severity) local go = next and vim.diagnostic.goto_next or vim.diagnostic.goto_prev severity = severity and vim.diagnostic.severity[severity] or nil return function() go { severity = severity } end end vim.keymap.set('n', 'cd', vim.diagnostic.open_float, { desc = 'Line Diagnostics' }) vim.keymap.set('n', ']d', diagnostic_goto(true), { desc = 'Next Diagnostic' }) vim.keymap.set('n', '[d', diagnostic_goto(false), { desc = 'Prev Diagnostic' }) vim.keymap.set('n', ']e', diagnostic_goto(true, 'ERROR'), { desc = 'Next Error' }) vim.keymap.set('n', '[e', diagnostic_goto(false, 'ERROR'), { desc = 'Prev Error' }) vim.keymap.set('n', ']w', diagnostic_goto(true, 'WARN'), { desc = 'Next Warning' }) vim.keymap.set('n', '[w', diagnostic_goto(false, 'WARN'), { desc = 'Prev Warning' }) vim.api.nvim_set_hl(0, '@lsp.type.unused', { link = 'Comment' }) -- jumping lines -- vim.keymap.del("n", "") -- vim.keymap.del("n", "") vim.keymap.set("n", "", "{", { noremap = true, silent = true }) -- Jump up to previous empty line vim.keymap.set("n", "", "}", { noremap = true, silent = true }) -- Jump down to next empty line vim.keymap.set('n', 'st', function() require('telescope.builtin').live_grep({ default_text = "// TODO:" }) end, { desc = "Search for TODO comments" }) vim.keymap.set('n', 'sx', function() require('telescope.builtin').live_grep({ default_text = "// FUTURE:" }) end, { desc = "Search for FUTURE comments" }) vim.keymap.set('n', 'si', function() require('telescope.builtin').live_grep({ default_text = "// IMPORTANT:" }) end, { desc = "Search for IMPORTANT comments" }) -- Define highlight groups for comment tags vim.api.nvim_set_hl(0, "FutureHighlight", { bg = "#3b4252", fg = "#81a1c1", bold = true }) -- Light blue vim.api.nvim_set_hl(0, "FixmeHighlight", { bg = "#3b4252", fg = "#bf616a", bold = true }) -- Red vim.api.nvim_set_hl(0, "NoteHighlight", { bg = "#3b4252", fg = "#ebcb8b", bold = true }) -- Yellow vim.api.nvim_set_hl(0, "QuestionHighlight", { bg = "#3b4252", fg = "#b48ead", bold = true }) -- Purple vim.api.nvim_set_hl(0, "ImportantHighlight", { bg = "#3b4252", fg = "#a3be8c", bold = true }) -- Green