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 keymap.set("i", "", "viwUea") -- Turn the current word into title case 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", function() vim.cmd([[ update $MYVIMRC source $MYVIMRC ]]) vim.notify("Nvim config successfully reloaded!", vim.log.levels.INFO, { title = "nvim-config" }) end, { silent = true, desc = "reload init.lua", }) -- Reselect the text that has just been pasted, see also https://stackoverflow.com/a/4317090/6064933. 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", function() vim.cmd([[ normal! mzJ`z delmarks z ]]) end, { desc = "join line", }) keymap.set("n", "gJ", function() -- we must use `normal!`, otherwise it will trigger recursive mapping vim.cmd([[ normal! zmgJ`z delmarks z ]]) end, { desc = "join visual lines", }) -- 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", "", "")