From 97db1c6c9d65002a33c6f76559c64c481dfad69a Mon Sep 17 00:00:00 2001 From: Sanchayan Maity Date: Sat, 25 Sep 2021 19:00:58 +0530 Subject: [PATCH] nvim: keymappings: Enable unique and refactor/cleanup Enable unique to detect and avoid conflicting key mappings. --- nvim/.config/nvim/lua/keymappings.lua | 182 +++++++++++++------------- 1 file changed, 92 insertions(+), 90 deletions(-) diff --git a/nvim/.config/nvim/lua/keymappings.lua b/nvim/.config/nvim/lua/keymappings.lua index 8bc21fc..3e7a641 100644 --- a/nvim/.config/nvim/lua/keymappings.lua +++ b/nvim/.config/nvim/lua/keymappings.lua @@ -1,131 +1,133 @@ -local remap = vim.api.nvim_set_keymap +local remap = vim.api.nvim_set_keymap +local expr_opts = { noremap=true, silent=true, unique=true, expr=true } +local opts = { noremap=true, silent=true, unique=true } -remap('c', '', '', { noremap = true }) +remap('c', '', '', opts) -- Use Q to execute default register. -remap('n', 'Q', '', { noremap = true }) +remap('n', 'Q', '', opts) -- Save -remap('n', 'w', ':w', { noremap = true }) +remap('n', 'w', ':w', opts) -- Copy to clipboard -remap('v', 'y', '"+y', { noremap = true }) -remap('v', 'Y', '"*y', { noremap = true }) -remap('n', 'p', '"+p', { noremap = true }) -remap('n', 'P', '"*p', { noremap = true }) +remap('v', 'y', '"+y' , opts) +remap('v', 'Y', '"*y' , opts) +remap('n', 'p', '"+p', opts) +remap('n', 'P', '"*p', opts) -- Search and Replace -remap('n', 'c.', ':%s//g', { noremap = true }) -remap('n', 'c.', ':%s/\\<\\>//g', { noremap = true }) +remap('n', 'c.' , ':%s//g' , opts) +remap('n', 'c.', ':%s/\\<\\>//g', opts) -- Quit -remap('n', 'x', ':x', { noremap = true }) -remap('n', 'q', ':q', { noremap = true }) -remap('n', 'Q', ':qa', { noremap = true }) +remap('n', 'x', ':x' , opts) +remap('n', 'q', ':q' , opts) +remap('n', 'Q', ':qa', opts) -- Navigate buffers -remap('n', '[b', ':bprevious', { noremap = true }) -remap('n', ']b', ':bnext', { noremap = true }) -remap('n', '[B', ':bfirst', { noremap = true }) -remap('n', ']B', ':blast', { noremap = true }) +remap('n', '[b', ':bprevious', opts) +remap('n', ']b', ':bnext' , opts) +remap('n', '[B', ':bfirst' , opts) +remap('n', ']B', ':blast' , opts) -- Reload buffer -remap('n', 'e', ':e', { noremap = true }) -remap('n', 'E', ':bufdo', { noremap = true }) +remap('n', 'e', ':e' , opts) +remap('n', 'E', ':bufdo', opts) -- Tab navigation -remap('n', 'tp', ':tabprevious', { noremap = true }) -remap('n', 'tn', ':tabnext', { noremap = true }) -remap('n', 'tf', ':tabfirst', { noremap = true }) -remap('n', 'tl', ':tablast', { noremap = true }) -remap('n', 'tN', ':tabnew', { noremap = true }) -remap('n', 'tc', ':tabclose', { noremap = true }) +remap('n', 'tp', ':tabprevious', opts) +remap('n', 'tn', ':tabnext' , opts) +remap('n', 'tf', ':tabfirst' , opts) +remap('n', 'tl', ':tablast' , opts) +remap('n', 'tN', ':tabnew' , opts) +remap('n', 'tc', ':tabclose' , opts) -- Jump to first tab & close all other tabs. Helpful after running Git -- difftool. -remap('n', 'T', ':tabfirst:tabonly', { noremap = true }) +remap('n', 'T', ':tabfirst:tabonly', opts) -- For tags -remap('n', '[t', ':tprevious', { noremap = true }) -remap('n', ']t', ':tNext', { noremap = true }) -remap('n', '[T', ':tfirst', { noremap = true }) -remap('n', ']T', ':tlast', { noremap = true }) -remap('n', 'ts', ':tselect ', { noremap = true }) +remap('n', '[t', ':tprevious', opts) +remap('n', ']t', ':tNext' , opts) +remap('n', '[T', ':tfirst' , opts) +remap('n', ']T', ':tlast' , opts) +remap('n', 'ts', ':tselect ', opts) -- Quickfix list mappings -remap('n', 'qo', ':copen', { noremap = true }) -remap('n', 'qc', ':cclose', { noremap = true }) -remap('n', '[q', ':cprevious', { noremap = true }) -remap('n', ']q', ':cnext', { noremap = true }) -remap('n', '[Q', ':cfirst', { noremap = true }) -remap('n', ']Q', ':clast', { noremap = true }) +remap('n', 'qo', ':copen' , opts) +remap('n', 'qc', ':cclose' , opts) +remap('n', '[q', ':cprevious', opts) +remap('n', ']q', ':cnext' , opts) +remap('n', '[Q', ':cfirst' , opts) +remap('n', ']Q', ':clast' , opts) -- Location list mappings -remap('n', 'Lo', ':lopen', { noremap = true }) -remap('n', 'Lc', ':lclose', { noremap = true }) -remap('n', '[l', ':lprevious', { noremap = true }) -remap('n', ']l', ':lnext', { noremap = true }) -remap('n', '[L', ':lfirst', { noremap = true }) -remap('n', ']L', ':lfirst', { noremap = true }) +remap('n', 'Lo', ':lopen' , opts) +remap('n', 'Lc', ':lclose' , opts) +remap('n', '[l', ':lprevious', opts) +remap('n', ']l', ':lnext' , opts) +remap('n', '[L', ':lfirst' , opts) +remap('n', ']L', ':lfirst' , opts) -- Preview tags -remap('n', 'pt', ':ptag ', { noremap = true }) -remap('n', '[p', ':ptprevious', { noremap = true }) -remap('n', ']p', ':ptnext', { noremap = true }) -remap('n', 'po', ':ppop', { noremap = true }) -remap('n', 'pc', ':pc', { noremap = true }) -remap('n', 'pi', ':psearch ', { noremap = true }) +remap('n', 'pt', ':ptag ' , opts) +remap('n', '[p', ':ptprevious' , opts) +remap('n', ']p', ':ptnext' , opts) +remap('n', 'po', ':ppop' , opts) +remap('n', 'pc', ':pc' , opts) +remap('n', 'pi', ':psearch ', opts) -- Short cuts for setting fold methods -remap('n', 'zmi', ':set foldmethod=indent', { noremap = true }) -remap('n', 'zmm', ':set foldmethod=manual', { noremap = true }) -remap('n', 'zme', ':set foldmethod=expr', { noremap = true }) -remap('n', 'zmk', ':set foldmethod=marker', { noremap = true }) -remap('n', 'zms', ':set foldmethod=syntax', { noremap = true }) +remap('n', 'zmi', ':set foldmethod=indent', opts) +remap('n', 'zmm', ':set foldmethod=manual', opts) +remap('n', 'zme', ':set foldmethod=expr' , opts) +remap('n', 'zmk', ':set foldmethod=marker', opts) +remap('n', 'zms', ':set foldmethod=syntax', opts) -- Key Bindings to help with terminal mode -remap('t', '', '', { noremap = true }) +remap('t', '', '', opts) -- Key bindings to move between window splits -remap('n', '0', '0w', { noremap = true }) -remap('n', '1', '1w', { noremap = true }) -remap('n', '2', '2w', { noremap = true }) -remap('n', '3', '3w', { noremap = true }) -remap('n', '4', '4w', { noremap = true }) -remap('n', '5', '5w', { noremap = true }) -remap('n', '6', '6w', { noremap = true }) -remap('n', '7', '7w', { noremap = true }) -remap('n', '8', '8w', { noremap = true }) -remap('n', '9', '9w', { noremap = true }) +remap('n', '0', '0w', opts) +remap('n', '1', '1w', opts) +remap('n', '2', '2w', opts) +remap('n', '3', '3w', opts) +remap('n', '4', '4w', opts) +remap('n', '5', '5w', opts) +remap('n', '6', '6w', opts) +remap('n', '7', '7w', opts) +remap('n', '8', '8w', opts) +remap('n', '9', '9w', opts) -- Tag helpers -remap('n', '', ':vsp :tag ', { noremap = true }) -remap('n', '', ':sp :tag ', { noremap = true }) +remap('n', '', ':vsp :tag ', opts) +remap('n', '' , ':sp :tag ' , opts) -remap('n', 'n', ':nohlsearch', { noremap = true, silent = true }) -remap('n', 'h', ':help', { noremap = true }) +remap('n', 'n', ':nohlsearch', opts) +remap('n', 'h', ':help' , opts) -- Move across wrapped lines like regular lines -- Go to the first non-blank character of a line -remap('n', '0', '^', { noremap = true }) +remap('n', '0', '^', opts) -- Just in case you need to go to the very beginning of a line -remap('n', '^', '0', { noremap = true }) +remap('n', '^', '0', opts) -- Make dot work on visually selected lines -remap('v', '.', ':norm.', { noremap = true }) +remap('v', '.', ':norm.', opts) -- Go to the last file we changed -remap('n', '', '', { noremap = true }) +remap('n', '', '', opts) -- Use Tab & S-Tab instead of C-g and C-t for incsearch -remap('c', '', 'getcmdtype() =~ \'[?/]\' ? \'\' : feedkeys(\'\', \'int\')[1]', { noremap = true, expr = true }) -remap('c', '', 'getcmdtype() =~ \'[?/]\' ? \'\' : feedkeys(\'\', \'int\')[1]', { noremap = true, expr = true }) +remap('c', '' , 'getcmdtype() =~ \'[?/]\' ? \'\' : feedkeys(\'\' , \'int\')[1]', expr_opts) +remap('c', '', 'getcmdtype() =~ \'[?/]\' ? \'\' : feedkeys(\'\', \'int\')[1]', expr_opts) -remap('n', '', ':call SyntaxAttr#SyntaxAttr()', { noremap = true }) -remap('n', '', ':TSHighlightCapturesUnderCursor', { noremap = true }) +remap('n', '', ':call SyntaxAttr#SyntaxAttr()' , opts) +remap('n', '', ':TSHighlightCapturesUnderCursor', opts) -- After shifting a visual block, select it again -remap('v', '<', '', '>gv', { noremap = true }) +remap('v', '<', '', '>gv', opts) -- Select last pasted/yanked text -remap('n', 'g', '`[v`]', { noremap = true }) +remap('n', 'g', '`[v`]', opts) -- Map ;; to : -remap('n', ';;', ':', { noremap = true }) +remap('n', ';;', ':', opts) -- https://vim.fandom.com/wiki/Moving_lines_up_or_down -remap('n', '', ':m .+1==', { noremap = true, silent = true }) -remap('n', '', ':m .-2==', { noremap = true, silent = true }) -remap('i', '', ':m .+1==gi', { noremap = true, silent = true }) -remap('i', '', ':m .-2==gi', { noremap = true, silent = true }) -remap('v', '', ':m \'>+1gv=gv', { noremap = true, silent = true }) -remap('v', '', ':m \'<-2gv=gv', { noremap = true, silent = true }) +remap('n', '', ':m .+1==' , opts) +remap('n', '', ':m .-2==' , opts) +remap('i', '', ':m .+1==gi', opts) +remap('i', '', ':m .-2==gi', opts) +remap('v', '', ':m \'>+1gv=gv' , opts) +remap('v', '', ':m \'<-2gv=gv' , opts) -- Marks -- '0 - Position of cursor when last exited Vim. @@ -138,6 +140,6 @@ remap('v', '', ':m \'<-2gv=gv', { noremap = true, silent = true }) -- Map gm to `. Instead of `a, hit gma. See :help mark-motions as to why we use backtick. remap('n', 'gm', '`', { noremap = false }) -- Jump using marks to last change, left insert, jump. -remap('n', 'mc', ':norm `.', { noremap = true }) -remap('n', 'mi', ':norm `^', { noremap = true }) -remap('n', 'mj', ':norm `\'', { noremap = true }) +remap('n', 'mc', ':norm `.' , opts) +remap('n', 'mi', ':norm `^' , opts) +remap('n', 'mj', ':norm `\'', opts)