local keymap = vim.keymap local uv = vim.uv keymap.set({ "n", "x" }, ";", ":", { desc = "enter command mode" }) keymap.set("i", "", "viwUea", { desc = "make word upper case" }) keymap.set("i", "", "b~lea", { desc = "make word title case" }) keymap.set("n", "p", "m`op``", { desc = "paste below current line" }) keymap.set("n", "P", "m`Op``", { desc = "paste above current line" }) keymap.set("n", "w", "update", { silent = true, desc = "save buffer" }) keymap.set("n", "q", "x", { silent = true, desc = "quit current window" }) keymap.set("n", "Q", "qa!", { silent = true, desc = "quit nvim" }) keymap.set("n", [[\x]], "windo lclose cclose ", { silent = true, desc = "close qf and location lists", }) keymap.set("n", [[\d]], "bprevious bdelete #", { silent = true, desc = "delete current buffer", }) keymap.set("n", [[\D]], function() local buf_ids = vim.api.nvim_list_bufs() local cur_buf = vim.api.nvim_win_get_buf(0) for _, buf_id in pairs(buf_ids) do if vim.api.nvim_get_option_value("buflisted", { buf = buf_id }) and buf_id ~= cur_buf then vim.api.nvim_buf_delete(buf_id, { force = true }) end end end, { desc = "delete other buffers" }) 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 base 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") -- Don't include white space characters when using '$' in visual mode keymap.set("x", "$", "g_") -- Go to start and end of line easier keymap.set({ "n", "x" }, "H", "^") keymap.set({ "n", "x" }, "L", "g_") -- Continuous visual shifting keymap.set("x", "<", "", ">gv") 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" }) keymap.set("n", "v", "printf('`[%s`]', getregtype()[0])", { expr = true, desc = "reselect last pasted area", }) keymap.set("n", "cd", "lcd %:p:hpwd", { desc = "change cwd" }) keymap.set("t", "", [[]], { desc = "quit term" }) 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 keymap.set("n", "c", '"_c') keymap.set("n", "C", '"_C') keymap.set("n", "cc", '"_cc') keymap.set("x", "c", '"_c') keymap.set("n", "", "StripTrailingWhitespace", { desc = "remove trailing spaces" }) keymap.set("n", "y", "%yank", { desc = "yank entire buffer" }) keymap.set("n", "cl", "call utils#ToggleCursorCol()", { desc = "toggle cursor column" }) keymap.set("n", "", 'call utils#SwitchLine(line("."), "up")', { desc = "move line up" }) keymap.set("n", "", 'call utils#SwitchLine(line("."), "down")', { desc = "move line down" }) keymap.set("x", "", 'call utils#MoveSelection("up")', { desc = "move selection up" }) keymap.set("x", "", 'call utils#MoveSelection("down")', { desc = "move selection down" }) keymap.set("x", "p", '"_cp', { desc = "replace visual selection with text in register without contaminating the register" }) 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") keymap.set({ "x", "o" }, "iu", "call text_obj#URL()", { desc = "URL text object" }) keymap.set({ "x", "o" }, "iB", ":call text_obj#Buffer()", { desc = "buffer text object" }) keymap.set("n", "J", function() vim.cmd([[ normal! mzJ`z delmarks z ]]) end, { desc = "join lines without moving cursor" }) keymap.set("n", "gJ", function() vim.cmd([[ normal! mzgJ`z delmarks z ]]) end, { desc = "join lines without moving cursor" }) -- Break inserted text into smaller undo units local undo_ch = { ",", ".", "!", "?", ";", ":" } for _, ch in ipairs(undo_ch) do keymap.set("i", ch, ch .. "u") end keymap.set("i", "", "miA;`ii", { desc = "insert semicolon at end" }) keymap.set("i", "", "", { desc = "go to beginning of line" }) keymap.set("i", "", "", { desc = "go to end of line" }) keymap.set("c", "", "", { desc = "go to beginning of command" }) keymap.set("i", "", "", { desc = "delete character to right of cursor" }) keymap.set("n", "cb", function() local cnt = 0 local blink_times = 7 local timer = uv.new_timer() if timer == nil then return end timer:start( 0, 100, vim.schedule_wrap(function() vim.cmd([[ set cursorcolumn! set cursorline! ]]) if cnt == blink_times then timer:close() end cnt = cnt + 1 end) ) end, { desc = "show cursor" })