-- ──────────────────────[ set leader key to space ]────────────────────── vim.g.mapleader = ' ' vim.g.maplocalleader = '\\' local keymap = vim.keymap -- ────────────────────────────[ general use ]──────────────────────────── keymap.set('i', 'jk', '', { desc = 'Exit insert mode with jk' }) keymap.set('n', 'nh', ':nohl', { desc = 'Clear search highlights' }) -- ────────────────────────────[ formatting ]───────────────────────── keymap.set({ 'n', 'v' }, 'mp', function() require('conform').format({ lsp_fallback = true, async = false, timeout_ms = 1000, }) end, { desc = 'Format file or range (in visual mode)' }) -- ──────────────────────────────[ linting ]────────────────────────────── keymap.set('n', 'l', function() require('lint').try_lint() end, { desc = 'Trigger linting for current file' }) -- ──────────────────────────[ inc/dec numbers ]────────────────────────── keymap.set('n', '+', '', { desc = 'Increment number' }) keymap.set('n', '-', '', { desc = 'Decrement number' }) -- ─────────────────────────[ split management ]────────────────────── keymap.set('n', 'sv', 'v', { desc = 'Split window vertically' }) keymap.set('n', 'sh', 's', { desc = 'Split window horizontally' }) keymap.set('n', 'se', '=', { desc = 'Make splits equal size' }) keymap.set('n', 'sx', 'close', { desc = 'Close current split' }) keymap.set('n', 'sm', 'MaximizerToggle', { desc = 'Maximize/Minimize a split' }) -- ──────────────────────────[ tab management ]─────────────────────── keymap.set('n', 'to', 'tabnew', { desc = 'Open new tab' }) keymap.set('n', 'tx', 'tabclose', { desc = 'Close current tab' }) -- keymap.set("n", "tn", "tabn", { desc = "Go to next tab" }) -- keymap.set("n", "tp", "tabp", { desc = "Go to previous tab" }) keymap.set('n', 'tf', 'tabnew %', { desc = 'Open current buffer in new tab' }) -- ────────────────────────────[ bufferline ]───────────────────────── keymap.set('n', 'bp', 'BufferLineTogglePin', { desc = 'Toggle pinned tab' }) keymap.set('n', 'bg', 'BufferLinePick', { desc = 'Pick tab' }) keymap.set('n', 'bx', 'bdelete', { desc = 'Close tab' }) keymap.set('n', 'bX', 'BufferLineCloseOthers', { desc = 'Close other tabs' }) keymap.set('n', ']b', 'BufferLineCycleNext', { desc = 'Next tab' }) keymap.set('n', '[b', 'BufferLineCyclePrev', { desc = 'Previous tab' }) keymap.set('n', '', 'BufferLineMoveNext', { desc = 'Move tab to the right' }) keymap.set('n', '', 'BufferLineMovePrev', { desc = 'Move tab to the left' }) -- ────────────────────────[ session management ]───────────────────── keymap.set('n', 'wa', 'SessionToggleAutoSave', { desc = 'Toggle session autosave' }) keymap.set('n', 'wD', 'Autosession delete', { desc = 'Delete a session' }) keymap.set('n', 'wd', 'SessionDelete', { desc = 'Delete session for cwd' }) keymap.set('n', 'wl', 'SessionSearch', { desc = 'Open session picker' }) keymap.set('n', 'wr', 'SessionRestore', { desc = 'Restore session for cwd' }) keymap.set('n', 'ws', 'SessionSave', { desc = 'Save session for cwd' }) -- ───────────────────────────[ todo comments ]─────────────────────────── keymap.set('n', ']t', function() require('todo-comments').jump_next() end, { desc = 'Next todo comment' }) keymap.set('n', '[t', function() require('todo-comments').jump_prev() end, { desc = 'Previous todo comment' }) -- ──────────────────────────────[ trouble ]────────────────────────────── keymap.set('n', 'xw', 'Trouble diagnostics toggle', { desc = 'Open trouble workspace diagnostics' }) keymap.set( 'n', 'xd', 'Trouble diagnostics toggle filter.buf=0', { desc = 'Open trouble document diagnostics' } ) keymap.set('n', 'xq', 'Trouble quickfix toggle', { desc = 'Open trouble quickfix list' }) keymap.set('n', 'xl', 'Trouble loclist toggle', { desc = 'Open trouble location list' }) keymap.set('n', 'xt', 'Trouble todo toggle', { desc = 'Open todos in trouble' }) -- ─────────────────────────────[ telescope ]───────────────────────────── keymap.set( 'n', 'ff', 'Telescope find_files initial_mode=insert sort_mru=true sort_lastused=true select_current=true', { desc = 'Fuzzy find files in cwd' } ) keymap.set( 'n', 'fr', 'Telescope oldfiles initial_mode=insert sort_mru=true sort_lastused=true select_current=true', { desc = 'Fuzzy find recent files' } ) keymap.set('n', 'fs', 'Telescope current_buffer_fuzzy_find', { desc = 'Find string in this buffer' }) keymap.set('n', 'fS', 'Telescope live_grep', { desc = 'Find string in cwd' }) keymap.set('n', 'fc', 'Telescope grep_string', { desc = 'Find string under cursor in cwd' }) keymap.set( 'n', 'ft', 'TodoTelescope initial_mode=normal sort_mru=true sort_lastused=true select_current=true', { desc = 'Find todos' } ) keymap.set( 'n', 'bb', 'Telescope buffers initial_mode=normal sort_mru=true sort_lastused=true select_current=true', { desc = 'Select from open buffers' } ) -- ────────────────────────────[ substitute ]───────────────────────── keymap.set('n', 's', function() require('substitute').operator() end, { desc = 'Substitute with motion' }) keymap.set('n', 'ss', function() require('substitute').line() end, { desc = 'Substitute line' }) keymap.set('n', 'S', function() require('substitute').eol() end, { desc = 'Substitute to end of line' }) keymap.set('x', 's', function() require('substitute').visual() end, { desc = 'Substitute in visual mode' }) -- ─────────────────────────────[ nvim-tree ]───────────────────────────── keymap.set('n', 'ee', 'NvimTreeToggle', { desc = 'Toggle file explorer' }) keymap.set('n', 'ef', 'NvimTreeFindFileToggle', { desc = 'Toggle file explorer on current file' }) keymap.set('n', 'ec', 'NvimTreeCollapse', { desc = 'Collapse file explorer' }) keymap.set('n', 'er', 'NvimTreeRefresh', { desc = 'Refresh file explorer' }) -- ───────────────────────────────[ diff ]──────────────────────────── keymap.set('n', 'hd', function() require('gitsigns').diffthis() end, { desc = 'Diff this' }) keymap.set('n', 'hD', function() require('gitsigns').diffthis('~') end, { desc = 'Diff this ~' }) -- ────────────────────────────────[ git ]──────────────────────────────── keymap.set('n', 'lg', 'LazyGit', { desc = 'Open LazyGit' }) keymap.set('n', ']h', function() require('gitsigns').nav_hunk('next') end, { desc = 'Next hunk' }) keymap.set('n', '[h', function() require('gitsigns').nav_hunk('prev') end, { desc = 'Prev hunk' }) keymap.set('n', 'hs', function() require('gitsigns').stage_hunk() end, { desc = 'Stage Hunk' }) keymap.set('n', 'hr', function() require('gitsigns').reset_hunk() end, { desc = 'Reset Hunk' }) keymap.set('v', 'hs', function() require('gitsigns').stage_hunk({ vim.fn.line('.'), vim.fn.line('v') }) end, { desc = 'Stage Hunk' }) keymap.set('v', 'hr', function() require('gitsigns').reset_hunk({ vim.fn.line('.'), vim.fn.line('v') }) end, { desc = 'Reset Hunk' }) keymap.set('n', 'hS', function() require('gitsigns').stage_buffer() end, { desc = 'Stage buffer' }) keymap.set('n', 'hR', function() require('gitsigns').reset_buffer() end, { desc = 'Reset buffer' }) keymap.set('n', 'hu', function() require('gitsigns').undo_stage_hunk() end, { desc = 'Undo stage hunk' }) keymap.set('n', 'hp', function() require('gitsigns').preview_hunk() end, { desc = 'Preview hunk' }) keymap.set('n', 'hb', function() require('gitsigns').blame_line({ full = true }) end, { desc = 'Blame line' }) keymap.set('n', 'hB', function() require('gitsigns').toggle_current_line_blame() end, { desc = 'Toggle line blame' }) keymap.set({ 'o', 'x' }, 'ih', ':Gitsigns select_hunk', { desc = 'Gitsigns select hunk' }) -- ────────────────────────────[ icon picker ]──────────────────────────── keymap.set( 'n', 'i', 'Telescope symbols initial_mode=normal theme=get_ivy', { desc = 'Open icon picker' } ) -- keymap.set("n", "iy", "IconPickerYank", { desc = "Yank icon into register" }) --> Yank the selected icon into register -- keymap.set("i", "", "Telescope symbols initial_mode=normal theme=get_ivy", { desc = "Open icon picker" })