local map = vim.keymap.set local opts = { noremap = true, silent = true } -- ═══════════════════════════════════════════════════════════ -- BUFFER NAVIGATION (think browser tabs) -- ═══════════════════════════════════════════════════════════ -- Tab/Shift-Tab: Like browser tabs, feels natural map("n", "", ":bnext", { desc = "Next buffer" }) map("n", "", ":bprevious", { desc = "Previous buffer" }) -- Alternative buffer switching (vim-style) map("n", "bn", ":bnext", { desc = "Next buffer" }) map("n", "bp", ":bprevious", { desc = "Previous buffer" }) map("n", "", "bprevious", { desc = "Prev Buffer" }) map("n", "", "bnext", { desc = "Next Buffer" }) map("n", "[b", "bprevious", { desc = "Prev Buffer" }) map("n", "]b", "bnext", { desc = "Next Buffer" }) -- Quick switch to last edited file (super useful!) map("n", "bb", "e #", { desc = "Switch to Other Buffer" }) map("n", "`", "e #", { desc = "Switch to Other Buffer" }) -- ═══════════════════════════════════════════════════════════ -- WINDOW MANAGEMENT (splitting and navigation) -- ═══════════════════════════════════════════════════════════ -- Move between windows with Ctrl+hjkl (like tmux) map("n", "", "h", { desc = "Go to Left Window", remap = true }) map("n", "", "j", { desc = "Go to Lower Window", remap = true }) map("n", "", "k", { desc = "Go to Upper Window", remap = true }) map("n", "", "l", { desc = "Go to Right Window", remap = true }) -- Resize windows with Ctrl+Shift+arrows (macOS friendly) map("n", "", "resize +5", opts) map("n", "", "resize -5", opts) map("n", "", "vertical resize -5", opts) map("n", "", "vertical resize +5", opts) -- Window splitting map("n", "ww", "p", { desc = "Other Window", remap = true }) map("n", "wd", "c", { desc = "Delete Window", remap = true }) map("n", "w-", "s", { desc = "Split Window Below", remap = true }) map("n", "sh", "s", { desc = "Split Window Below", remap = true }) map("n", "w|", "v", { desc = "Split Window Right", remap = true }) map("n", "|", "v", { desc = "Split Window Right", remap = true }) map("n", "sv", "v", { desc = "Split Window Right", remap = true }) -- ═══════════════════════════════════════════════════════════ -- SMART LINE MOVEMENT (the VSCode experience) -- ═══════════════════════════════════════════════════════════ -- Smart j/k: moves by visual lines when no count, real lines with count map({ "n", "x" }, "j", "v:count == 0 ? 'gj' : 'j'", { desc = "Down", expr = true, silent = true }) map({ "n", "x" }, "", "v:count == 0 ? 'gj' : 'j'", { desc = "Down", expr = true, silent = true }) map({ "n", "x" }, "k", "v:count == 0 ? 'gk' : 'k'", { desc = "Up", expr = true, silent = true }) map({ "n", "x" }, "", "v:count == 0 ? 'gk' : 'k'", { desc = "Up", expr = true, silent = true }) -- Move lines up/down (Alt+j/k like VSCode) map("n", "", "execute 'move .+' . v:count1==", { desc = "Move Down" }) map("n", "", "execute 'move .-' . (v:count1 + 1)==", { desc = "Move Up" }) map("i", "", "m .+1==gi", { desc = "Move Down" }) map("i", "", "m .-2==gi", { desc = "Move Up" }) map("v", "", ":execute \"'<,'>move '>+\" . v:count1gv=gv", { desc = "Move Down" }) map("v", "", ":execute \"'<,'>move '<-\" . (v:count1 + 1)gv=gv", { desc = "Move Up" }) -- Alternative line movement (for terminals that don't support Alt) map("v", "J", ":move '>+1gv=gv", { desc = "Move Block Down" }) map("v", "K", ":move '<-2gv=gv", { desc = "Move Block Up" }) map("n", "", ":m .+1", opts) map("n", "", ":m .-2", opts) map("i", "", ":m .+1==gi", opts) map("i", "", ":m .-2==gi", opts) map("v", "", ":m '>+1gv=gv", opts) map("v", "", ":m '<-2gv=gv", opts) -- ═══════════════════════════════════════════════════════════ -- SEARCH & NAVIGATION (ergonomic improvements) -- ═══════════════════════════════════════════════════════════ -- Better line start/end (more comfortable than $ and ^) map("n", "gl", "$", { desc = "Go to end of line" }) map("n", "gh", "^", { desc = "Go to start of line" }) map("n", "", "^", { desc = "Go to start of line", silent = true }) map("n", "", "$", { desc = "Go to end of line", silent = true }) -- Select all content map("n", "==", "ggG") map("n", "", "ggVG", { noremap = true, silent = true, desc = "Select all" }) -- Clear search highlighting map({ "i", "n" }, "", "noh", { desc = "Escape and Clear hlsearch" }) map("n", "ur", "nohlsearchdiffupdatenormal! ", { desc = "Redraw / Clear hlsearch / Diff Update" }) -- Smart search navigation (n always goes forward, N always backward) map("n", "n", "'Nn'[v:searchforward].'zv'", { expr = true, desc = "Next Search Result" }) map("x", "n", "'Nn'[v:searchforward]", { expr = true, desc = "Next Search Result" }) map("o", "n", "'Nn'[v:searchforward]", { expr = true, desc = "Next Search Result" }) map("n", "N", "'nN'[v:searchforward].'zv'", { expr = true, desc = "Prev Search Result" }) map("x", "N", "'nN'[v:searchforward]", { expr = true, desc = "Prev Search Result" }) map("o", "N", "'nN'[v:searchforward]", { expr = true, desc = "Prev Search Result" }) -- ═══════════════════════════════════════════════════════════ -- SMART TEXT EDITING -- ═══════════════════════════════════════════════════════════ -- Better indenting (stay in visual mode) map("v", "<", "", ">gv") -- Better paste (doesn't replace clipboard with deleted text) map("v", "p", '"_dP', opts) -- Copy whole file to clipboard map("n", "", ":%y+", opts) -- Smart undo break-points (create undo points at logical stops) map("i", ",", ",u") map("i", ".", ".u") map("i", ";", ";u") -- Auto-close pairs (simple, no plugin needed) map("i", "`", "``") map("i", '"', '""') map("i", "(", "()") map("i", "[", "[]") map("i", "{", "{}") map("i", "<", "<>") -- Note: Single quotes commented out to avoid conflicts in some contexts -- map("i", "'", "''") -- ═══════════════════════════════════════════════════════════ -- FILE OPERATIONS -- ═══════════════════════════════════════════════════════════ -- Save file (works in all modes) map({ "i", "x", "n", "s" }, "", "w", { desc = "Save File" }) -- Create new file map("n", "fn", "enew", { desc = "New File" }) -- Quit operations map("n", "qq", "qa", { desc = "Quit All" }) -- ═══════════════════════════════════════════════════════════ -- DEVELOPMENT TOOLS -- ═══════════════════════════════════════════════════════════ -- Commenting (add comment above/below current line) map("n", "gco", "oVcxnormal gccfxa", { desc = "Add Comment Below" }) map("n", "gcO", "OVcxnormal gccfxa", { desc = "Add Comment Above" }) -- Quickfix and location lists map("n", "xl", function() local success, err = pcall(vim.fn.getloclist(0, { winid = 0 }).winid ~= 0 and vim.cmd.lclose or vim.cmd.lopen) if not success and err then vim.notify(err, vim.log.levels.ERROR) end end, { desc = "Location List" }) map("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" }) map("n", "[q", vim.cmd.cprev, { desc = "Previous Quickfix" }) map("n", "]q", vim.cmd.cnext, { desc = "Next Quickfix" }) -- Inspection tools (useful for debugging highlights and treesitter) map("n", "ui", vim.show_pos, { desc = "Inspect Pos" }) map("n", "uI", "InspectTree", { desc = "Inspect Tree" }) -- Keyword program (K for help on word under cursor) map("n", "K", "norm! K", { desc = "Keywordprg" }) -- ═══════════════════════════════════════════════════════════ -- TERMINAL INTEGRATION -- ═══════════════════════════════════════════════════════════ -- Terminal mode navigation map("t", "", "", { desc = "Enter Normal Mode" }) map("t", "", "wincmd h", { desc = "Go to Left Window" }) map("t", "", "wincmd j", { desc = "Go to Lower Window" }) map("t", "", "wincmd k", { desc = "Go to Upper Window" }) map("t", "", "wincmd l", { desc = "Go to Right Window" }) map("t", "", "close", { desc = "Hide Terminal" }) map("t", "", "close", { desc = "which_key_ignore" }) -- ═══════════════════════════════════════════════════════════ -- TAB MANAGEMENT (when you need multiple workspaces) -- ═══════════════════════════════════════════════════════════ map("n", "l", "tablast", { desc = "Last Tab" }) map("n", "o", "tabonly", { desc = "Close Other Tabs" }) map("n", "f", "tabfirst", { desc = "First Tab" }) map("n", "", "tabnew", { desc = "New Tab" }) map("n", "]", "tabnext", { desc = "Next Tab" }) map("n", "d", "tabclose", { desc = "Close Tab" }) map("n", "[", "tabprevious", { desc = "Previous Tab" }) -- ═══════════════════════════════════════════════════════════ -- FOLDING NAVIGATION (for code organization) -- ═══════════════════════════════════════════════════════════ -- Close all folds except current one (great for focus) map("n", "zv", "zMzvzz", { desc = "Close all folds except the current one" }) -- Smart fold navigation (closes current, opens next/previous) map("n", "zj", "zcjzOzz", { desc = "Close current fold when open. Always open next fold." }) map("n", "zk", "zckzOzz", { desc = "Close current fold when open. Always open previous fold." }) -- ═══════════════════════════════════════════════════════════ -- UTILITY SHORTCUTS -- ═══════════════════════════════════════════════════════════ -- Toggle line wrapping map("n", "tw", "set wrap!", { desc = "Toggle Wrap", silent = true }) -- Fix spelling (picks first suggestion) map("n", "z0", "1z=", { desc = "Fix word under cursor" })