From aabcc30883850faec416aa84f7706ddad1795805 Mon Sep 17 00:00:00 2001 From: "David T. Sadler" Date: Tue, 10 Feb 2026 21:12:45 +0000 Subject: Update Neovim key mappings --- nvim/.config/nvim/lua/config/keymaps.lua | 157 ++++++++++++++++++++++--------- 1 file changed, 113 insertions(+), 44 deletions(-) (limited to 'nvim') diff --git a/nvim/.config/nvim/lua/config/keymaps.lua b/nvim/.config/nvim/lua/config/keymaps.lua index bb3758f..8e7dc0a 100644 --- a/nvim/.config/nvim/lua/config/keymaps.lua +++ b/nvim/.config/nvim/lua/config/keymaps.lua @@ -2,47 +2,116 @@ local set = vim.keymap.set --- Move lines up/down -set('n', '', ':m .+1==', { desc = 'Move line down' }) -set('n', '', ':m .-2==', { desc = 'Move line up' }) -set('i', '', ':m .+1==gi', { desc = 'Move line down' }) -set('i', '', ':m .-2==gi', { desc = 'Move line up' }) -set('v', '', ":m '>+1gv=gv", { desc = 'Move selection down' }) -set('v', '', ":m '<-2gv=gv", { desc = 'Move selection up' }) - --- Better indenting in visual mode -set('v', '<', '', '>gv', { desc = 'Indent right and reselect' }) - --- Buffer navigation -set('n', 'bn', ':bnext', { desc = 'Next buffer' }) -set('n', 'bp', ':bprevious', { desc = 'Previous buffer' }) - --- Splitting & Resizing -set('n', 'sv', ':vsplit', { desc = 'Split window vertically' }) -set('n', 'sh', ':split', { desc = 'Split window horizontally' }) -set('n', 'se', '=', { desc = 'Make split windows equal width & height' }) -set('n', '', ':resize +2', { desc = 'Increase window height' }) -set('n', '', ':resize -2', { desc = 'Decrease window height' }) -set('n', '', ':vertical resize -2', { desc = 'Decrease window width' }) -set('n', '', ':vertical resize +2', { desc = 'Increase window width' }) - --- Center screen when jumping -set('n', 'n', 'nzzzv', { desc = 'Next search result (centered)' }) -set('n', 'N', 'Nzzzv', { desc = 'Previous search result (centered)' }) -set('n', '', 'zz', { desc = 'Half page down (centered)' }) -set('n', '', 'zz', { desc = 'Half page up (centered)' }) - --- Better paste behavior -set('x', 'p', '"_dP', { desc = 'Paste without yanking' }) - --- Delete without yanking -set({ 'n', 'v' }, 'd', '"_d', { desc = 'Delete without yanking' }) - --- Toggle visible whitespace characters -set('n', 'l', ':set list!', { desc = 'Toggle hidden characters' }) - --- Quickly source current file / execute Lua code -set('n', 'xx', 'source %', { desc = 'Source current file' }) -set('n', 'x', ':.lua', { desc = 'Lua: execute current line' }) -set('v', 'x', ':lua', { desc = 'Lua: execute current selection' }) +-- Better up/down though display lines instead of logical lines. +-- But still allow count when jumping by logical lines. +set({ 'n', 'x' }, 'j', "v:count == 0 ? 'gj' : 'j'", { desc = 'Down', expr = true, silent = true }) +set({ 'n', 'x' }, '', "v:count == 0 ? 'gj' : 'j'", { desc = 'Down', expr = true, silent = true }) +set({ 'n', 'x' }, 'k', "v:count == 0 ? 'gk' : 'k'", { desc = 'Up', expr = true, silent = true }) +set({ 'n', 'x' }, '', "v:count == 0 ? 'gk' : 'k'", { desc = 'Up', expr = true, silent = true }) + +-- Window using arrow keys. +set('n', '', 'resize +2', { desc = 'Increase Window Height' }) +set('n', '', 'resize -2', { desc = 'Decrease Window Height' }) +set('n', '', 'vertical resize -2', { desc = 'Decrease Window Width' }) +set('n', '', 'vertical resize +2', { desc = 'Increase Window Width' }) + +-- Move lines up/down. +set('n', '', "execute 'move .+' . v:count1==", { desc = 'Move Down' }) +set('n', '', "execute 'move .-' . (v:count1 + 1)==", { desc = 'Move Up' }) +set('i', '', 'm .+1==gi', { desc = 'Move Down' }) +set('i', '', 'm .-2==gi', { desc = 'Move Up' }) +set('v', '', ":execute \"'<,'>move '>+\" . v:count1gv=gv", { desc = 'Move Down' }) +set('v', '', ":execute \"'<,'>move '<-\" . (v:count1 + 1)gv=gv", { desc = 'Move Up' }) + +-- Buffer navigation. +set('n', '', 'bprevious', { desc = 'Prev Buffer' }) +set('n', '', 'bnext', { desc = 'Next Buffer' }) +set('n', '[b', 'bprevious', { desc = 'Prev Buffer' }) +set('n', ']b', 'bnext', { desc = 'Next Buffer' }) +set('n', 'bb', 'e #', { desc = 'Switch to Other Buffer' }) +set('n', '`', 'e #', { desc = 'Switch to Other Buffer' }) + +-- https://github.com/mhinz/vim-galore#saner-behavior-of-n-and-n +-- Saner search behavior: n always goes forward, N always goes backward. +-- Added 'zz' to keep the result centered. +set('n', 'n', "'Nn'[v:searchforward].'zzzv'", { expr = true, desc = 'Next Search Result' }) +set('x', 'n', "'Nn'[v:searchforward]", { expr = true, desc = 'Next Search Result' }) +set('o', 'n', "'Nn'[v:searchforward]", { expr = true, desc = 'Next Search Result' }) +set('n', 'N', "'nN'[v:searchforward].'zzzv'", { expr = true, desc = 'Prev Search Result' }) +set('x', 'N', "'nN'[v:searchforward]", { expr = true, desc = 'Prev Search Result' }) +set('o', 'N', "'nN'[v:searchforward]", { expr = true, desc = 'Prev Search Result' }) + +-- Have undo breakpoints set every time a punctuation mark is typed. +-- Ensures more granular history is preserved during undo. +set('i', ',', ',u', { desc = 'Undo Breakpoint: ,' }) +set('i', '.', '.u', { desc = 'Undo Breakpoint: .' }) +set('i', ';', ';u', { desc = 'Undo Breakpoint: ;' }) + +-- Save file with Ctrl+S +set({ 'i', 'x', 'n', 's' }, '', 'w', { desc = 'Save File' }) + +-- Use built-in 'K' to access Linux man pages directly (essential for C/Shell dev). +set('n', 'K', 'norm! K', { desc = 'Lookup System Manual' }) + +-- Better indenting in visual mode. +set('v', '<', '', '>gv', { desc = 'Indent Right And Reselect' }) + +-- Commenting. +set('n', 'gco', 'oVcxnormal gccfxa', { desc = 'Add Comment Below' }) +set('n', 'gcO', 'OVcxnormal gccfxa', { desc = 'Add Comment Above' }) + +-- Quickfix list +set('n', 'xq', function() + local success, err = pcall(vim.fn.getqflist({ winid = 0 }).winid ~= 0 and vim.cmd.cclose or vim.cmd.copen) + if not success and err then + vim.notify(err, vim.log.levels.ERROR) + end +end, { desc = 'Quickfix List' }) + +set('n', '[q', vim.cmd.cprev, { desc = 'Previous Quickfix' }) +set('n', ']q', vim.cmd.cnext, { desc = 'Next Quickfix' }) + +-- LSP Diagnostic Navigation. +local diagnostic_goto = function(next, severity) + return function() + vim.diagnostic.jump({ + count = (next and 1 or -1) * vim.v.count1, + severity = severity and vim.diagnostic.severity[severity] or nil, + float = true, + }) + end +end +set('n', 'cd', vim.diagnostic.open_float, { desc = 'Line Diagnostics' }) +set('n', ']d', diagnostic_goto(true), { desc = 'Next Diagnostic' }) +set('n', '[d', diagnostic_goto(false), { desc = 'Prev Diagnostic' }) +set('n', ']e', diagnostic_goto(true, 'ERROR'), { desc = 'Next Error' }) +set('n', '[e', diagnostic_goto(false, 'ERROR'), { desc = 'Prev Error' }) +set('n', ']w', diagnostic_goto(true, 'WARN'), { desc = 'Next Warning' }) +set('n', '[w', diagnostic_goto(false, 'WARN'), { desc = 'Prev Warning' }) + +-- 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' }) + +-- Window Splitting. +set('n', 'sh', 's', { desc = 'Split Window Below' }) +set('n', 'sv', 'v', { desc = 'Split Window Right' }) +set('n', 'wd', 'c', { desc = 'Delete Window', remap = true }) +set('n', 'se', '=', { desc = 'Make Split Windows Equal Width & Height' }) + +-- Center screen when jumping. +set('n', '', 'zz', { desc = 'Half Page down (Centered)' }) +set('n', '', 'zz', { desc = 'Half Page Up (Centered)' }) + +-- Better paste behavior. +set('x', 'p', '"_dP', { desc = 'Paste Without Yanking' }) + +-- Delete without yanking. +set({ 'n', 'v' }, 'd', '"_d', { desc = 'Delete Without Yanking' }) + +-- Toggle visible whitespace characters.... +set('n', 'l', 'set list!', { desc = 'Toggle Hidden Characters' }) + +-- Quickly source current file. +set('n', 'xx', 'source %', { desc = 'Source Current File' }) -- cgit v1.2.3-13-gbd6f