From 11e6797cb5cc5cadbd148e20308818c68aabd335 Mon Sep 17 00:00:00 2001 From: jdhao Date: Tue, 6 Sep 2022 21:22:45 +0800 Subject: refactor: convert mapping from viml to lua --- core/mappings.lua | 294 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 294 insertions(+) create mode 100644 core/mappings.lua (limited to 'core/mappings.lua') diff --git a/core/mappings.lua b/core/mappings.lua new file mode 100644 index 0000000..3bcc6fa --- /dev/null +++ b/core/mappings.lua @@ -0,0 +1,294 @@ +local keymap = vim.keymap +local api = vim.api + +-- Save key strokes (now we do not need to press shift to enter command mode). +keymap.set({ "n", "x" }, ";", ":") + +-- Turn the word under cursor to upper case +-- inoremap viwUea +keymap.set("i", "", "viwUea") + +-- Turn the current word into title case +-- inoremap b~lea +keymap.set("i", "", "b~lea") + +-- Paste non-linewise text above or below current line, see https://stackoverflow.com/a/1346777/6064933 +keymap.set("n", "p", "m`op``", { + desc = "paste below current line", +}) +keymap.set("n", "P", "m`Op``", { + desc = "paste above current line", +}) + +-- Shortcut for faster save and quit +keymap.set("n", "w", "update", { + silent = true, + desc = "save buffer", +}) + +-- Saves the file if modified and quit +keymap.set("n", "q", "x", { + silent = true, + desc = "quit current window", +}) + +-- Quit all opened buffers +keymap.set("n", "Q", "qa!", { + silent = true, + desc = "quit nvim", +}) + +-- Navigation in the location and quickfix list +keymap.set("n", "[l", "lpreviouszv", { + silent = true, + desc = "previous location item", +}) +keymap.set("n", "]l", "lnextzv", { + silent = true, + desc = "next location item", +}) + +keymap.set("n", "[L", "lfirstzv", { + silent = true, + desc = "first location item", +}) +keymap.set("n", "]L", "llastzv", { + silent = true, + desc = "last location item", +}) + +keymap.set("n", "[q", "cpreviouszv", { + silent = true, + desc = "previous qf item", +}) +keymap.set("n", "]q", "cnextzv", { + silent = true, + desc = "next qf item", +}) + +keymap.set("n", "[Q", "cfirstzv", { + silent = true, + desc = "first qf item", +}) +keymap.set("n", "]Q", "clastzv", { + silent = true, + desc = "last qf item", +}) + +-- Close location list or quickfix list if they are present, see https://superuser.com/q/355325/736190 +keymap.set("n", [[\x]], "windo lclose cclose ", { + silent = true, + desc = "close qf and location list", +}) + +-- Delete a buffer, without closing the window, see https://stackoverflow.com/q/4465095/6064933 +keymap.set("n", [[\d]], "bprevious bdelete #", { + silent = true, + desc = "delete buffer", +}) + +-- Insert a blank line below or above current line (do not move the cursor), +-- see https://stackoverflow.com/a/16136133/6064933 +keymap.set("n", "o", "printf('m`%so``', v:count1)", { + expr = true, + desc = "insert line below", +}) + +keymap.set("n", "O", "printf('m`%sO``', v:count1)", { + expr = true, + desc = "insert line above", +}) + +-- Move the cursor based on physical lines, not the actual lines. +keymap.set("n", "j", "v:count == 0 ? 'gj' : 'j'", { expr = true }) +keymap.set("n", "k", "v:count == 0 ? 'gk' : 'k'", { expr = true }) +keymap.set("n", "^", "g^") +keymap.set("n", "0", "g0") + +-- Do not include white space characters when using $ in visual mode, +-- see https://vi.stackexchange.com/q/12607/15292 +keymap.set("x", "$", "g_") + +-- Go to start or end of line easier +keymap.set({ "n", "x" }, "H", "^") +keymap.set({ "n", "x" }, "L", "g_") + +-- Continuous visual shifting (does not exit Visual mode), `gv` means +-- to reselect previous visual area, see https://superuser.com/q/310417/736190 +keymap.set("x", "<", "", ">gv") + +-- Edit and reload nvim config file quickly +keymap.set("n", "ev", "tabnew $MYVIMRC tcd %:h", { + silent = true, + desc = "open init.lua", +}) + +keymap.set("n", "sv", "", { + silent = true, + desc = "reload init.lua", + callback = function() + vim.cmd [[ + update $MYVIMRC + source $MYVIMRC + ]] + vim.notify("Nvim config successfully reloaded!", vim.log.levels.INFO, { title = "nvim-config" }) + end, +}) + +-- Reselect the text that has just been pasted, see also https://stackoverflow.com/a/4317090/6064933. +-- nnoremap v +keymap.set("n", "v", "printf('`[%s`]', getregtype()[0])", { + expr = true, + desc = "reselect last pasted area", +}) + +-- Always use very magic mode for searching +keymap.set("n", "/", [[/\v]]) + +-- Search in selected region +-- xnoremap / :call feedkeys('/\%>'.(line("'<")-1).'l\%<'.(line("'>")+1)."l") + +-- Change current working directory locally and print cwd after that, +-- see https://vim.fandom.com/wiki/Set_working_directory_to_the_current_file +keymap.set("n", "cd", "lcd %:p:hpwd", { + desc = "change cwd", +}) + +-- Use Esc to quit builtin terminal +keymap.set("t", "", [[]]) + +-- Toggle spell checking +keymap.set("n", "", "set spell!", { + desc = "toggle spell", +}) +keymap.set("i", "", "set spell!", { + desc = "toggle spell", +}) + +-- Change text without putting it into the vim register, +-- see https://stackoverflow.com/q/54255/6064933 +keymap.set("n", "c", '"_c') +keymap.set("n", "C", '"_C') +keymap.set("n", "cc", '"_cc') +keymap.set("x", "c", '"_c') + +-- Remove trailing whitespace characters +keymap.set("n", "", "StripTrailingWhitespace", { + desc = "remove trailing space", +}) + +-- check the syntax group of current cursor position +keymap.set("n", "st", "call utils#SynGroup()", { + desc = "check syntax group", +}) + +-- Copy entire buffer. +keymap.set("n", "y", "%yank", { + desc = "yank entire buffer", +}) + +-- Toggle cursor column +keymap.set("n", "cl", "call utils#ToggleCursorCol()", { + desc = "toggle cursor column", +}) + +-- Move current line up and down +keymap.set("n", "", 'call utils#SwitchLine(line("."), "up")', { + desc = "move line up", +}) +keymap.set("n", "", 'call utils#SwitchLine(line("."), "down")', { + desc = "move line down", +}) + +-- Move current visual-line selection up and down +keymap.set("x", "", 'call utils#MoveSelection("up")', { + desc = "move selection up", +}) + +keymap.set("x", "", 'call utils#MoveSelection("down")', { + desc = "move selection down", +}) + +-- Replace visual selection with text in register, but not contaminate the register, +-- see also https://stackoverflow.com/q/10723700/6064933. +keymap.set("x", "p", '"_cp') + +-- Go to a certain buffer +keymap.set("n", "gb", 'call buf_utils#GoToBuffer(v:count, "forward")', { + desc = "go to buffer (forward)", +}) +keymap.set("n", "gB", 'call buf_utils#GoToBuffer(v:count, "backward")', { + desc = "go to buffer (backward)", +}) + +-- Switch windows +keymap.set("n", "", "h") +keymap.set("n", "", "l") +keymap.set("n", "", "k") +keymap.set("n", "", "j") + +-- Text objects for URL +keymap.set({ "x", "o" }, "iu", "call text_obj#URL()", { + desc = "URL text object", +}) + +-- Text objects for entire buffer +keymap.set({ "x", "o" }, "iB", "call text_obj#Buffer()", { + desc = "buffer text object", +}) + +-- Do not move my cursor when joining lines. +keymap.set("n", "J", "", { + desc = "join line", + callback = function() + vim.cmd [[ + normal! mzJ`z + delmarks z + ]] + end, +}) + +keymap.set("n", "gJ", "mzgJ`z", { + desc = "join visual lines", + callback = function() + -- we must use `normal!`, otherwise it will trigger recursive mapping + vim.cmd [[ + normal! zmgJ`z + delmarks z + ]] + end +}) + +-- Break inserted text into smaller undo units when we insert some punctuation chars. +local undo_ch = {',', '.', '!', '?', ';', ':'} +for _, ch in ipairs(undo_ch) do + keymap.set('i', ch, ch .. 'u') +end + +-- insert semicolon in the end +keymap.set('i', '', 'miA;`ii') + +-- Keep cursor position after yanking +keymap.set('n', 'y', 'myy') + +api.nvim_create_autocmd('TextYankPost', { + pattern = '*', + group = api.nvim_create_augroup("restore_after_yank", { clear = true }), + callback = function() + vim.cmd [[ + silent! normal! `y + silent! delmarks y + ]] + end +}) + +-- Go to the beginning and end of current line in insert mode quickly +keymap.set('i', '', '') +keymap.set('i', '', '') + +-- Go to beginning of command in command-line mode +keymap.set('c', '', '') + +-- Delete the character to the right of the cursor +keymap.set('i', '', '') -- cgit v1.2.3