-- Leader Map vim.g.mapleader = ' ' vim.g.maplocalleader = ' ' vim.keymap.set({ 'n', 'v' }, '', '', { silent = true }) local opts = { noremap = true, silent = true } -- Movement vim.keymap.set("n", "n", "nzzzv", { desc = "Next search result (centered)" }) vim.keymap.set("n", "N", "Nzzzv", { desc = "Previous search result (centered)" }) vim.keymap.set("n", "", "zz", { desc = "Half page down (centered)" }) vim.keymap.set("n", "", "zz", { desc = "Half page up (centered)" }) vim.keymap.set("n", "", ":m .+1==", { desc = "Move line down" }) vim.keymap.set("n", "", ":m .-2==", { desc = "Move line up" }) vim.keymap.set("v", "", ":m '>+1gv=gv", { desc = "Move selection down" }) vim.keymap.set("v", "", ":m '<-2gv=gv", { desc = "Move selection up" }) -- Split Navigation vim.keymap.set('n', 'vs', 'v', { desc = 'Split window vertically' }) vim.keymap.set('n', 'hs', 's', { desc = 'Split window horizontally' }) vim.keymap.set('n', 'es', '=', { desc = 'Equalize splits' }) vim.keymap.set('n', 'xs', ':close', { desc = 'Close split' }) vim.keymap.set('n', '', ':wincmd k', opts) vim.keymap.set('n', '', ':wincmd j', opts) vim.keymap.set('n', '', ':wincmd h', opts) vim.keymap.set('n', '', ':wincmd l', opts) vim.keymap.set('n', '', ':resize -2', opts) vim.keymap.set('n', '', ':resize +2', opts) vim.keymap.set('n', '', ':vertical resize -2', opts) vim.keymap.set('n', '', ':vertical resize +2', opts) -- Buffer Navigation vim.keymap.set("n", "bn", ":bnext", { desc = "Next buffer" }) vim.keymap.set("n", "bp", ":bprevious", { desc = "Previous buffer" }) -- File Navigation vim.keymap.set("n", "e", ":Explore", { desc = "Open file explorer" }) vim.keymap.set("n", "ff", ":find ", { desc = "Find file" }) -- Tab Navigation vim.keymap.set('n', 'tn', ':tabnew', { desc = 'New tab' }) vim.keymap.set('n', 'tx', ':tabclose', { desc = 'Close tab' }) vim.keymap.set('n', 'tm', ':tabmove', { desc = 'Move tab' }) vim.keymap.set('n', 't>', ':tabmove +1', { desc = 'Move tab right' }) vim.keymap.set('n', 't<', ':tabmove -1', { desc = 'Move tab left' }) -- Function to open file in new tab local function open_file_in_tab() vim.ui.input({ prompt = 'File to open in new tab: ', completion = 'file' }, function(input) if input and input ~= '' then vim.cmd('tabnew ' .. input) end end) end -- Function to duplicate current tab local function duplicate_tab() local current_file = vim.fn.expand('%:p') if current_file ~= '' then vim.cmd('tabnew ' .. current_file) else vim.cmd('tabnew') end end -- Function to close tabs to the right local function close_tabs_right() local current_tab = vim.fn.tabpagenr() local last_tab = vim.fn.tabpagenr('$') for i = last_tab, current_tab + 1, -1 do vim.cmd(i .. 'tabclose') end end -- Function to close tabs to the left local function close_tabs_left() local current_tab = vim.fn.tabpagenr() for i = current_tab - 1, 1, -1 do vim.cmd('1tabclose') end end vim.keymap.set('n', 'tO', open_file_in_tab, { desc = 'Open file in new tab' }) vim.keymap.set('n', 'td', duplicate_tab, { desc = 'Duplicate current tab' }) vim.keymap.set('n', 'tr', close_tabs_right, { desc = 'Close tabs to the right' }) vim.keymap.set('n', 'tL', close_tabs_left, { desc = 'Close tabs to the left' }) -- Function to close buffer but keep tab if it's the only buffer in tab local function smart_close_buffer() local buffers_in_tab = #vim.fn.tabpagebuflist() if buffers_in_tab > 1 then vim.cmd('bdelete') else -- If it's the only buffer in tab, close the tab vim.cmd('tabclose') end end vim.keymap.set('n', 'bd', smart_close_buffer, { desc = 'Smart close buffer/tab' }) -- Diagnostic keymaps vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Go to previous diagnostic message' }) vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Go to next diagnostic message' }) vim.keymap.set('n', 'd', vim.diagnostic.open_float, { desc = 'Open floating diagnostic message' }) vim.keymap.set('n', 'q', vim.diagnostic.setloclist, { desc = 'Open diagnostics list' }) -- Convenience vim.keymap.set({ "n", "v" }, "d", '"_d', { desc = "Delete without yanking" }) vim.keymap.set("x", "p", [["_dP]], { desc = 'Paste previously yanked' }) vim.keymap.set('n', 'lw', 'set wrap!', opts) vim.keymap.set('v', '<', '', '>gv', opts) vim.keymap.set("n", "c", ":nohlsearch", { desc = "Clear search highlights" }) vim.keymap.set("n", "J", "mzJ`z", { desc = "Join lines and keep cursor position" }) vim.keymap.set("n", "rc", ":e $MYVIMRC", { desc = "Edit config" }) vim.keymap.set("n", "rl", ":so $MYVIMRC", { desc = "Reload config" })