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