local which_key = require('which-key') local icons = require('lib.icons') local setup = { preset = 'helix', plugins = { marks = true, registers = true, spelling = { enabled = true, suggestions = 30, }, presets = { operators = true, motions = true, text_objects = true, windows = true, nav = true, z = true, g = true, }, }, icons = { breadcrumb = icons.ui.ArrowOpen, separator = icons.ui.Arrow, group = '', keys = { Space = icons.ui.Rocket, }, rules = false, -- enable auto icon rules }, show_help = false, show_keys = true, triggers = { { '', mode = 'nixsotc' }, { '', mode = { 'n', 'v' } }, }, } local n_mappings = { mode = 'n', { 'b', group = ' Debug' }, { 'bO', 'DapStepOut', desc = 'Out' }, { 'bR', 'DapRestartFrame', desc = 'Restart Frame' }, { 'bb', 'DapToggleBreakpoint', desc = 'Breakpoint' }, { 'bc', 'DapContinue', desc = 'Continue' }, { 'bi', 'DapStepInto', desc = 'Into' }, { 'bl', "lua require'dap'.run_last()", desc = 'Last' }, { 'bo', 'DapStepOver', desc = 'Over' }, { 'br', 'DapToggleRepl', desc = 'Repl' }, { 'bt', 'DapUIToggle', desc = 'Debugger' }, { 'bx', 'DapTerminate', desc = 'Exit' }, { 'c', group = ' Code' }, { 'cF', 'retab', desc = 'Fix Tabs' }, { 'cP', 'CccConvert', desc = 'Convert Color' }, { 'cR', 'ReloadConfig', desc = 'Reload Configs' }, { 'cc', 'CccHighlighterToggle', desc = 'Highlight Colors' }, { 'cd', 'RootDir', desc = 'Root Directory' }, { 'cf', group = 'Formate File' }, { 'ch', 'Hardtime toggle', desc = 'Hardtime' }, { 'cl', ':g/^\\s*$/d', desc = 'Clean Empty Lines' }, { 'cm', 'MarkdownPreviewToggle', desc = 'Markdown Preview' }, { 'cn', 'Telescope notify', desc = 'Notifications' }, { 'co', 'Dashboard', desc = 'Dashboard' }, { 'cp', 'CccPick', desc = 'Pick Color' }, { 'cr', 'Telescope reloader', desc = 'Reload Module' }, { 'C', group = ' Comment' }, { 'Cb', 'CBccbox', desc = 'Comment Box' }, { 'Ct', 'CBllline', desc = 'Tiled line' }, { 'Cl', 'CBline', desc = 'Line' }, { 'Cm', 'CBllbox14', desc = 'Marked' }, { 'Cc', 'CBcatalog', desc = 'Catalog' }, { 'Cd', 'CBd', desc = 'Delete Comment Style' }, { 'd', group = ' Database' }, { 'du', 'DBUIToggle', desc = 'Toggle DB UI' }, { 'db', 'DBUIFindBuffer', desc = 'DB Find buffer' }, { 'dr', 'DBUIRenameBuffer', desc = 'DB Rename buffer' }, { 'dl', 'DBUILastQueryInfo', desc = 'DB Last query' }, { 'e', group = ' Edit' }, { 'ea', 'b#', desc = 'Alternate File' }, { 'ec', 'e $MYVIMRC', desc = 'Config' }, { 'ed', 'lua require("telescope.builtin").find_files({cwd = vim.fn.stdpath("config")})', desc = 'Config Dir', }, { 'ee', ':Neotree toggle float', silent = true, desc = 'Float File Explorer' }, { 'eE', ':Neotree toggle left', silent = true, desc = 'Left File Explorer' }, { 'ef', 'Telescope file_browser', desc = 'File Browser' }, { 'em', 'e README.md', desc = 'Readme' }, { 'en', 'new', desc = 'New File' }, { 'f', group = ' Find' }, { 'ff', 'Telescope find_files', desc = 'Find Files (CWD)' }, { 'fg', 'Telescope live_grep', desc = 'Live Grep' }, { 'fb', 'Telescope buffers', desc = 'Buffers' }, { 'fh', 'Telescope help_tags', desc = 'Find Help' }, { 'fo', 'Telescope oldfiles', desc = 'Old Recent Files' }, { 'fm', 'Telescope marks', desc = 'Marks' }, { 'fH', 'Telescope highlights', desc = 'Find Highlight Groups' }, { 'fG', 'Telescope grep_string', desc = 'Grep String' }, { 'kk', 'Telescope keymaps', desc = 'Keymaps' }, { 'kc', 'Telescope commands', desc = 'Commands' }, { 'kh', 'Telescope command_history', desc = 'Command History' }, { 'ks', 'Telescope search_history', desc = 'Search History' }, { 'fd', 'Telescope diagnostics', desc = 'Diagnostics' }, { 'fu', 'Telescope undo', desc = 'Undo History' }, { 'fb', 'Telescope buffers', desc = 'Buffers' }, { 'fq', 'Telescope quickfix', desc = 'Quickfix' }, { 'fs', 'Telescope current_buffer_fuzzy_find', desc = 'Fuzzy Find in File' }, { 'h', group = ' Help' }, { 'hh', 'Telescope help_tags', desc = 'Help Pages' }, { 'hi', 'vim.show_pos', desc = 'Inspect Position' }, { 'hk', 'Lspsaga hover_doc', desc = 'Hover Doc' }, { 'hm', 'Telescope man_pages', desc = 'Man Pages' }, { 'i', group = ' Insert' }, { 'iP', 'put %:p', desc = 'Absolute Path' }, { 'id', "put =strftime('## %a, %d %b, %Y, %r')", desc = 'Date' }, { 'ie', 'Telescope symbols', desc = 'Emojis' }, { 'if', "put =expand('%:t')", desc = 'File Name' }, { 'in', 'Nerdy', desc = 'Nerd Glyphs' }, { 'ip', 'put %', desc = 'Relative Path' }, { 'ir', 'Telescope registers', desc = 'Registers' }, { 'it', "put =strftime('## %r')", desc = 'Time' }, { 'j', group = ' Jump' }, { 'jN', "lua require('flash').jump({search = { forward = false, wrap = false, multi_window = false },})", desc = 'Search Backward', }, { 'jc', '*', desc = 'Word' }, { 'jd', 'FlashDiagnostics', desc = 'Diagnostics' }, { 'jf', 'Telescope jumplist', desc = 'Jumplist' }, { 'jh', '', desc = 'Backward' }, { 'jj', "lua require('flash').remote()", desc = 'Remote' }, { 'jk', "lua require('flash').treesitter()", desc = 'Treesitter' }, { 'jl', '', desc = 'Forward' }, { 'jn', "lua require('flash').jump({search = { forward = true, wrap = false, multi_window = false },})", desc = 'Search Forward', }, { 'jp', "lua require('flash').jump({continue = true})", desc = 'Previous Jump' }, { 'js', "lua require('flash').jump()", desc = 'Search' }, { 'jt', "lua require('flash').treesitter_search()", desc = 'Remote Treesitter' }, { 'jw', 'lua require("flash").jump({ pattern = vim.fn.expand("")})', desc = 'Current Word', }, { 'k', group = ' Keys' }, { 'kc', 'Telescope commands', desc = 'Commands' }, { 'kh', 'Telescope command_history', desc = 'Command History' }, { 'kk', 'Telescope keymaps', desc = 'Keymaps' }, { 'ks', 'Telescope search_history', desc = 'Search History' }, { 'kt', 'Screenkey', desc = 'Toggle keys' }, { 'l', group = ' LSP' }, { 'lF', 'Telescope lsp_references layout_strategy=vertical', desc = 'References' }, { 'lL', 'Lspsaga show_workspace_diagnostics', desc = 'Workspace Diagnostics' }, { 'lP', 'Telescope lsp_outgoing_calls', desc = 'Outgoing Calls' }, { 'lQ', 'LspRestart', desc = 'Restart LSP' }, { 'lR', 'Lspsaga project_replace', desc = 'Replace' }, { 'lS', 'Telescope lsp_dynamic_workspace_symbols', desc = 'Workspace Symbols' }, { 'lT', 'Lspsaga goto_type_definition', desc = 'Goto Type Definition' }, { 'la', 'Lspsaga code_action', desc = 'Code Action' }, { 'ld', 'Lspsaga peek_definition', desc = 'Peek Definition' }, { 'lf', 'Lspsaga finder', desc = 'Finder' }, { 'lg', 'Lspsaga goto_definition', desc = 'Goto Definition' }, { 'lh', 'Lspsaga hover_doc', desc = 'Hover' }, { 'li', 'LspInfo', desc = 'LSP Info' }, { 'lj', 'Lspsaga diagnostic_jump_next', desc = 'Next Diagnostic' }, { 'lk', 'Lspsaga diagnostic_jump_prev', desc = 'Prev Diagnostic' }, { 'll', 'Telescope diagnostics layout_strategy=vertical', desc = 'File Diagnostics' }, { 'lo', 'Lspsaga outline', desc = 'Outline' }, { 'lp', 'Telescope lsp_incoming_calls', desc = 'Incoming Calls' }, { 'lq', 'LspStop', desc = 'Stop LSP' }, { 'lr', 'Lspsaga rename', desc = 'Rename' }, { 'ls', 'Telescope lsp_document_symbols theme=get_ivy', desc = 'Document Symbols' }, { 'lt', 'Lspsaga peek_type_definition', desc = 'Peek Type Definition' }, { 'm', group = ' Misc' }, { 'ms', function() require('persistence').load() end, desc = 'Restore Session', }, { 'ml', function() require('persistence').load({ last = true }) end, desc = 'Restore Last Session', }, { 'md', function() require('persistence').stop() end, desc = "Don't Save Current Session", }, { 'o', group = ' Options' }, { 'oc', 'Telescope colorscheme', desc = 'Colorscheme' }, { 'oh', 'Telescope highlights', desc = 'Highlight Colors' }, { 'on', 'set relativenumber!', desc = 'Relative Numbers' }, { 'oo', 'Telescope vim_options', desc = 'All Options' }, { 'q', group = ' Quit' }, { 'qa', 'qall', desc = 'Quit All' }, { 'qc', 'bw', desc = 'Close Buffer' }, { 'qd', 'bdelete', desc = 'Delete Buffer' }, { 'qf', 'qall!', desc = 'Force Quit' }, { 'qo', ':%bdelete|b#|bdelete#', desc = 'Close Others' }, { 'qq', 'q', desc = 'Quit' }, { 'qs', 'c', desc = 'Close Split' }, { 'qw', 'wq', desc = 'Write and Quit' }, { 'r', group = ' Refactor' }, { 'rR', "lua require('telescope').extensions.refactoring.refactors()", desc = 'Refactor Commands', }, { 'rS', "lua require('spectre').open()", desc = 'Replace' }, { 'rb', "lua require('spectre').open_file_search()", desc = 'Replace Buffer' }, { 'rd', '', desc = 'Go To Definition' }, { 're', "lua require('refactoring').refactor('Extract Block')", desc = 'Extract Block' }, { 'rf', "lua require('refactoring').refactor('Extract Block To File')", desc = 'Extract To File', }, { 'rh', '', desc = 'List Definition Head' }, { 'ri', "lua require('refactoring').refactor('Inline Variable')", desc = 'Inline Variable' }, { 'rj', '', desc = 'Next Usage' }, { 'rk', '', desc = 'Previous Usage' }, { 'rl', '', desc = 'List Definition' }, { 'rn', '', desc = 'Swap Next' }, { 'rp', '', desc = 'Swap Previous' }, { 'rr', '', desc = 'Smart Rename' }, { 'rs', ':%s/\\<\\>//gI', desc = 'Replace Word' }, { 'rv', "lua require('refactoring').refactor('Extract Variable')", desc = 'Extract Variable' }, { 'rw', "lua require('spectre').open_visual({select_word=true})", desc = 'Replace Word' }, { 's', group = ' Split' }, { 's+', 'resize +10', desc = 'Increase window height' }, { 's-', 'vertical resize -20', desc = 'Decrease window width' }, { 's/', 's', desc = 'Split Below' }, { 's=', 'vertical resize +20', desc = 'Increase window width' }, { 'sH', 'vertical resize -10', desc = 'Decrease window width' }, { 'sJ', 'resize -5', desc = 'Decrease window height' }, { 'sK', 'resize +5', desc = 'Increase window height' }, { 'sL', 'vertical resize +10', desc = 'Increase window width' }, { 's\\', 'v', desc = 'Split Right' }, { 's_', 'resize -10', desc = 'Decrease window height' }, { 's`', 'p', desc = 'Previous Window' }, { 'sa', 'split', desc = 'Horizontal Split' }, { 'sc', 'tabclose', desc = 'Close Tab' }, { 'sf', 'tabfirst', desc = 'First Tab' }, { 'sh', 'h', desc = 'Move Left' }, { 'sj', 'j', desc = 'Move Down' }, { 'sk', 'k', desc = 'Move Up' }, { 'sl', 'l', desc = 'Move Right' }, { 'sp', 'NavigatorPrevious', desc = 'Previous Pane' }, { 'sq', 'c', desc = 'Close Split' }, { 'ss', 'vsplit', desc = 'Vertical Split' }, { 't', group = ' Terminal' }, { 't1', '1ToggleTerm', desc = 'Toggle Terminal' }, { 't2', '2ToggleTerm', desc = 'Toggle Terminal' }, { 'th', 'Sterm', desc = 'Horizontal Terminal' }, { 'tv', 'Vterm', desc = 'Vertical Terminal' }, { 'u', group = ' Test' }, { 'uc', 'lua require("neotest").run.run()', desc = 'Run Current Test' }, { 'uf', 'lua require("neotest").run.run(vim.fn.expand("%"))', desc = 'Run Test File' }, { 'uo', 'lua require("neotest").output.open({ enter = true, auto_close = true })', desc = 'Show Output', }, { 'uS', 'lua require("neotest").summary.toggle', desc = 'Toggle Summary' }, { 'ur', 'lua require("neotest").run.run()', desc = 'Run Nearest Test' }, { 'us', 'lua require("neotest").run.stop()', desc = 'Stop' }, { 'uO', 'lua require("neotest").output_panel.toggle', desc = 'Toggle Output Panel' }, { 'v', group = ' Select' }, { 'vB', 'vab', desc = 'Around Bracket' }, { 'vP', 'vap', desc = 'Around Para' }, { 'vQ', 'vaq', desc = 'Around Quote' }, { 'vb', 'vib', desc = 'Bracket' }, { 'vp', 'vip', desc = 'Paragraph' }, { 'vq', 'viq', desc = 'Quote' }, { 'w', group = ' Writing' }, { 'wc', 'set spell!', desc = 'Spellcheck' }, { 'wF', ':SudaWrite', desc = 'Suda Write' }, { 'wf', "lua require'utils'.sudo_write()", desc = 'Force Write' }, { 'wj', ']s', desc = 'Next Misspell' }, { 'wk', '[s', desc = 'Prev Misspell' }, { 'wq', 'wq', desc = 'Write and Quit' }, { 'ws', 'Telescope spell_suggest', desc = 'Suggestions' }, { 'wt', 'Twilight', desc = 'Twilight' }, { 'ww', 'w', desc = 'Write and Quit' }, { 'wz', 'ZenMode', desc = 'ZenMode' }, { 'x', 'x', desc = ' Save and Quit' }, { 'x', group = '󰁨 Diagnostics/Quickfix' }, { 'xx', 'Trouble diagnostics toggle', desc = 'Diagnostics (Trouble)' }, { 'xX', 'Trouble diagnostics toggle filter.buf=0', desc = 'Buffer Diagnostics (Trouble)' }, { 'xs', 'Trouble symbols toggle', desc = 'Symbols (Trouble)' }, { 'xS', 'Trouble lsp toggle', desc = 'LSP references/definitions/... (Trouble)' }, { 'xL', 'Trouble loclist toggle', desc = 'Location List (Trouble)' }, { 'xQ', 'Trouble qflist toggle', desc = 'Quickfix List (Trouble)' }, { 'y', group = ' Yank' }, { 'yp', function() require('telescope').extensions.yank_history.yank_history({}) end, desc = 'Open Yank History', }, { 'yP', 'CopyAbsolutePath', desc = 'Absolute Path' }, { 'ya', '%y+', desc = 'Copy Whole File' }, { 'yf', 'CopyFileName', desc = 'File Name' }, { 'yg', 'lua require"gitlinker".get_buf_range_url()', desc = 'Copy Git URL' }, { 'yp', 'CopyRelativePath', desc = 'Relative Path' }, } local v_mappings = { mode = 'v', { 'c', group = ' Code' }, { 'cS', ':sort!', desc = 'Sort Desc' }, { 'ci', ':sort i', desc = 'Sort Case Insensitive' }, { 'cs', ':sort', desc = 'Sort Asc' }, { 'cu', ':!uniq', desc = 'Unique' }, { 'cx', "'<,'>SnipRun", desc = 'Run Code' }, { 'C', group = ' Comment' }, { 'Cb', 'CBccbox', desc = 'Comment Box' }, { 'Ct', 'CBllline', desc = 'Tiled line' }, { 'Cl', 'CBline', desc = 'Line' }, { 'Cm', 'CBllbox14', desc = 'Marked' }, { 'Cc', 'CBcatalog', desc = 'Catalog' }, { 'Cd', 'CBd', desc = 'Delete Comment Style' }, { 'j', group = ' Jump' }, { 'jN', "lua require('flash').jump({search = { forward = false, wrap = false, multi_window = false },})", desc = 'Search Backward', }, { 'jd', 'FlashDiagnostics', desc = 'Diagnostics' }, { 'jj', "lua require('flash').remote()", desc = 'Remote' }, { 'jk', "lua require('flash').treesitter()", desc = 'Treesitter' }, { 'jn', "lua require('flash').jump({search = { forward = true, wrap = false, multi_window = false },})", desc = 'Search Forward', }, { 'jp', "lua require('flash').jump({continue = true})", desc = 'Previous Jump' }, { 'js', "lua require('flash').jump()", desc = 'Search' }, { 'jt', "lua require('flash').treesitter_search()", desc = 'Remote Treesitter' }, { 'jw', 'lua require("flash").jump({ pattern = vim.fn.expand("")})', desc = 'Current Word', }, { 'l', group = ' LSP' }, { 'la', desc = 'Lspsaga range_code_action' }, { 'r', group = ' Refactor' }, { 're', "lua require('refactoring').refactor('Extract Function')", desc = 'Extract Function', }, { 'rf', "lua require('refactoring').refactor('Extract Function To File')", desc = 'Extract To File', }, { 'ri', "lua require('refactoring').refactor('Inline Variable')", desc = 'Inline Variable' }, { 'rr', "lua require('telescope').extensions.refactoring.refactors()", desc = 'Refactor Commands', }, { 'rv', "lua require('refactoring').refactor('Extract Variable')", desc = 'Extract Variable', }, { 'y', group = ' Yank' }, { 'yg', 'lua require"gitlinker".get_buf_range_url("v")', desc = 'Copy Git URL' }, } local no_leader_mappings = { mode = 'n', { '', 'resize -10', desc = 'Decrease window height' }, { '', 'vertical resize -10', desc = 'Decrease window width' }, { '', 'vertical resize +10', desc = 'Increase window width' }, { '', 'resize +10which_key.add(no_leader_mappings)', desc = 'Increase window height' }, { '', 'Telescope find_files', desc = 'Find Files' }, { '', 'Fterm lazygit', desc = 'Lazygit' }, { '', 'h', desc = 'Move Left' }, { '', 'j', desc = 'Move Down' }, { '', 'k', desc = 'Move Up' }, { '', 'l', desc = 'Move Right' }, { '', 'p', desc = 'Previous Pane' }, { '', 'bprevious', desc = 'Previous Buffer' }, { '', 'bnext', desc = 'Next Buffer' }, { '', 'bprevious', desc = 'Previous Buffer' }, { '', 'bnext', desc = 'Next Buffer' }, { 'K', 'Lspsaga hover_doc', desc = 'LSP Hover' }, { 'Q', 'qall!', desc = 'Force Quit!' }, { 'U', 'redo', desc = 'Redo' }, { '[', group = ' Previous' }, { '[B', 'bfirst', desc = 'First Buffer' }, { '[b', 'bprevious', desc = 'Buffer' }, { '[d', 'Lspsaga diagnostic_jump_prev', desc = 'Diagnostic' }, { '[e', 'g;', desc = 'Edit' }, { '[g', 'Gitsigns prev_hunk', desc = 'Git Hunk' }, { '[j', '', desc = 'Jump' }, { ']', group = ' Next' }, { ']B', 'blast', desc = 'Buffer' }, { ']b', 'bnext', desc = 'Buffer' }, { ']d', 'Lspsaga diagnostic_jump_next', desc = 'Diagnostic' }, { ']e', 'g,', desc = 'Edit' }, { ']g', 'Gitsigns next_hunk', desc = 'Git Hunk' }, { ']j', '', desc = 'Jump' }, { '', '(YankyCycleForward)' }, { '', '(YankyCycleBackward)' }, { 'y', '(YankyYank)', mode = { 'n', 'x' }, desc = 'Yank text' }, { 'p', '(YankyPutAfter)', mode = { 'n', 'x' }, desc = 'Put yanked text after cursor' }, { 'P', '(YankyPutBefore)', mode = { 'n', 'x' }, desc = 'Put yanked text before cursor' }, { 'gp', '(YankyGPutAfter)', mode = { 'n', 'x' }, desc = 'Put yanked text after selection' }, { 'gP', '(YankyGPutBefore)', mode = { 'n', 'x' }, desc = 'Put yanked text before selection' }, { '', ':call vm#commands#add_cursor_down(0, v:count1)', desc = 'Add Cursor Down', mode = { 'n' }, noremap = true, silent = true, }, { '', ':call vm#commands#add_cursor_up(0, v:count1)', desc = 'Add Cursor Up', mode = { 'n' }, noremap = true, silent = true, }, { '', ':call vm#commands#add_cursor_down(0, v:count1)', desc = 'Add Cursor Down', mode = { 'n' }, noremap = true, silent = true, }, { '', ':call vm#commands#add_cursor_up(0, v:count1)', desc = 'Add Cursor Down', mode = { 'n' }, noremap = true, silent = true, }, { '', ':call vm#commands#ctrln(v:count1)', desc = 'Multi Edit Next', mode = { 'n' }, noremap = true, silent = true, }, } which_key.setup(setup) which_key.add(n_mappings) which_key.add(v_mappings) which_key.add(no_leader_mappings)