local which_key = require('which-key') local icons = require('lib.icons') local setup = { preset = 'modern', 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 }, win = { no_overlap = true, border = 'rounded', width = 0.8, height = { min = 5, max = 25 }, padding = { 1, 2 }, title = true, title_pos = 'center', zindex = 1000, wo = { winblend = 10, }, }, layout = { width = { min = 20 }, spacing = 6, align = 'center', }, show_help = false, show_keys = true, triggers = { { '', mode = 'nixsotc' }, { '', mode = { 'n', 'v' } }, }, } local normal_mappings = { mode = 'n', { 'a', group = ' AI' }, { 'aF', 'CopilotChatFixDiagnostic', desc = 'Fix Diagnostic' }, { 'aG', 'CopilotChatCommitStaged', desc = 'Commit Staged' }, { 'ac', 'CopilotChatToggle', desc = 'Copilot Chat' }, { 'ad', 'CopilotChatDocs', desc = 'Docs' }, { 'ae', 'CopilotChatExplain', desc = 'Explain' }, { 'af', 'CopilotChatFix', desc = 'Fix' }, { 'ag', 'CopilotChatCommit', desc = 'Commit' }, { 'al', 'CopilotChatLoad', desc = 'Load Chat' }, { 'ao', 'CopilotChatOptimize', desc = 'Optimize' }, { 'ar', 'CopilotChatReview', desc = 'Review' }, { 'as', 'CopilotChatSave', desc = 'Save Chat' }, { 'at', 'CopilotChatTests', desc = 'Tests' }, { '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' }, { 'ce', '%SnipRun', desc = 'Execute File' }, { 'cf', 'lua vim.lsp.buf.format({async = true})', desc = 'Format File' }, { 'cl', ':g/^\\s*$/d', desc = 'Clean Empty Lines' }, { 'cm', 'MarkdownPreviewToggle', desc = 'Markdown Preview' }, { 'cn', 'lua require("snacks").notifier.show_history()', desc = 'Notifications' }, { 'co', 'Dashboard', desc = 'Dashboard' }, { 'cp', 'CccPick', desc = 'Pick Color' }, { 'cr', 'Telescope reloader', desc = 'Reload Module' }, { 'cs', 'source %', desc = 'Source File' }, { 'd', group = ' Database' }, { 'dS', 'lua require("dbee").store("json", "buffer", { extra_arg = 0 })', desc = 'To JSON' }, { 'db', 'DBToggle', desc = 'DB Explorer' }, { 'dj', 'lua require("dbee").next()', desc = 'DB Next' }, { 'dk', 'lua require("dbee").prev()', desc = 'DB Prev' }, { 'ds', 'lua require("dbee").store("csv", "buffer", { extra_arg = 0 })', desc = 'To CSV' }, { 'dt', 'lua require("dbee").store("table", "buffer", { extra_arg = 0 })', desc = 'To Table' }, { 'e', group = ' Edit' }, { 'ea', 'b#', desc = 'Alternate File' }, { 'ec', group = 'Edit Configs' }, { 'eca', 'e ~/.config/shell/aliases.sh', desc = 'Shell Aliases' }, { 'ecA', 'e ~/.config/alacritty/alacritty.toml', desc = 'Alacritty Config' }, { 'ecb', 'e ~/.bashrc', desc = 'Bash Config' }, { 'ecc', 'lua require("telescope.builtin").find_files({cwd = vim.fn.stdpath("config")})', desc = 'Neovim Configs', }, { 'ecd', 'lua require("telescope.builtin").find_files({cwd = vim.fn.expand("$DOTS_DIR")})', desc = 'Dotfiles', }, { 'ece', 'e ~/.config/shell/environment.sh', desc = 'Environment Config' }, { 'ecf', 'e ~/.config/shell/functions.sh', desc = 'Shell Functions' }, { 'ecg', 'e ~/.gitconfig', desc = 'Git Config' }, { 'eck', 'e ~/.config/kitty/kitty.conf', desc = 'Kitty Config' }, { 'ecl', 'e ~/.config/shell/local.sh', desc = 'Local Env' }, { 'ecn', 'e $MYVIMRC', desc = 'Neovim Init' }, { 'ecp', 'e ~/.config/nvim/lua/plugins/list.lua', desc = 'Plugin List' }, { 'ecq', 'e ~/.config/qutebrowser/config.py', desc = 'Qutebrowser Config' }, { 'ect', 'e ~/.config/tmux/tmux.conf', desc = 'Tmux Config' }, { 'ecv', 'e ~/.vimrc', desc = 'Vim Config' }, { 'ecz', 'e $ZDOTDIR/.zshrc', desc = 'Zsh Config' }, { 'ecZ', 'e $ZDOTDIR/prompt/init.zsh', desc = 'Zsh Prompt Config' }, { 'et', 'lua MiniFiles.open()', desc = 'Explore Tree' }, { 'ef', 'gf', desc = 'File Under Cursor' }, { 'em', 'e README.md', desc = 'Readme' }, { 'en', 'enew', desc = 'New File' }, { 'f', group = ' Find' }, { 'fa', 'Telescope find_files', desc = 'All Files' }, { 'fc', 'Telescope git_bcommits', desc = 'File Commits' }, { 'ff', 'Telescope git_files', desc = 'Find files' }, { 'fg', 'lua require("plugins.tools.telescope-custom").multi_grep()', desc = 'Find Text', }, { 'fj', 'Telescope buffers', desc = 'Buffers' }, { 'fl', 'Telescope loclist', desc = 'Location List' }, { 'fm', 'Telescope git_status', desc = 'Modified files' }, { 'fo', 'Telescope live_grep grep_open_files=true', desc = 'Find in Open Files' }, { 'fp', 'Telescope resume', desc = 'Last Search' }, { 'fP', 'lua require("telescope.builtin").find_files({cwd = vim.fs.joinpath(vim.fn.stdpath("data"), "lazy")})', desc = 'Plugin Files', }, { 'fq', 'Telescope quickfix', desc = 'Quickfix' }, { 'fr', 'Telescope oldfiles', desc = 'Recent Files' }, { 'fs', 'Telescope current_buffer_fuzzy_find', desc = 'Fuzzy Find in File' }, { 'ft', 'Telescope', desc = 'Panel' }, { 'fu', 'Telescope undo', desc = 'Undo History' }, { 'fw', 'Telescope grep_string', desc = 'Find Word' }, { 'g', group = ' Git' }, { 'gA', 'Gitsigns stage_buffer', desc = 'Stage Buffer' }, { 'gC', 'CoAuthor', desc = 'Co-Authors' }, { 'gP', 'Git push', desc = 'Push' }, { 'gR', 'Gitsigns reset_buffer', desc = 'Reset Buffer' }, { 'gS', 'Telescope git_stash', desc = 'Stashed Changes' }, { 'ga', 'Gitsigns stage_hunk', desc = 'Stage Hunk' }, { 'gb', "lua require('gitsigns').blame_line({full = true})", desc = 'Blame' }, { 'gB', "lua require('snacks').git.blame_line()", desc = 'Detailed Blame' }, { 'gc', 'Telescope git_commits', desc = 'Find Commits' }, { 'gd', 'Gitsigns diffthis HEAD', desc = 'Diff' }, { 'gf', 'Git', desc = 'Fugitive Panel' }, { 'gg', 'lua require("snacks").lazygit()', desc = 'Lazygit' }, { 'gi', 'Gitsigns preview_hunk', desc = 'Hunk Info' }, { 'gj', 'Gitsigns next_hunk', desc = 'Next Hunk' }, { 'gk', 'Gitsigns prev_hunk', desc = 'Prev Hunk' }, { 'gl', 'lua require("snacks").lazygit.log()', desc = 'Lazygit Log' }, { 'gL', 'Git log', desc = 'Log' }, { 'go', group = 'Octohub' }, { 'gp', 'Git pull', desc = 'Pull' }, { 'gr', 'Gitsigns reset_hunk', desc = 'Reset Hunk' }, { 'gs', 'Telescope git_branches', desc = 'Switch Branch' }, { 'gt', group = 'Toggle' }, { 'gtb', 'Gitsigns toggle_current_line_blame', desc = 'Blame' }, { 'gtd', 'Gitsigns toggle_deleted', desc = 'Deleted' }, { 'gtl', 'Gitsigns toggle_linehl', desc = 'Line HL' }, { 'gtn', 'Gitsigns toggle_numhl', desc = 'Number HL' }, { 'gts', 'Gitsigns toggle_signs', desc = 'Signs' }, { 'gtw', 'Gitsigns toggle_word_diff', desc = 'Word Diff' }, { 'gu', 'Gitsigns undo_stage_hunk', desc = 'Undo Stage Hunk' }, { 'gv', 'Gitsigns select_hunk', desc = 'Select Hunk' }, { 'gw', 'lua require("snacks").gitbrowse()', desc = 'Git Browse' }, { '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' }, { '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' }, { '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 = ' Marks' }, { 'm1', "lua require('marks').toggle_bookmark1()", desc = 'Toggle Bookmark 0' }, { 'm2', "lua require('marks').toggle_bookmark2()", desc = 'Toggle Bookmark 2' }, { 'm3', "lua require('marks').toggle_bookmark3()", desc = 'Toggle Bookmark 3' }, { 'm4', "lua require('marks').toggle_bookmark4()", desc = 'Toggle Bookmark 4' }, { 'mD', "lua require('marks').delete_buf()", desc = 'Delete Buffer' }, { 'mP', "lua require('marks').preview()", desc = 'Preview' }, { 'mb', "lua require('telescope').extensions.marks_nvim.bookmarks_list_all()", desc = 'Bookmarks', }, { 'md', "lua require('marks').delete_line()", desc = 'Delete Line' }, { 'mh', "lua require('marks').next_bookmark()", desc = 'Next Bookmark' }, { 'mj', "lua require('marks').next()", desc = 'Next' }, { 'mk', "lua require('marks').prev()", desc = 'Previous' }, { 'ml', "lua require('marks').prev_bookmark()", desc = 'Previous Bookmark' }, { 'mm', 'Telescope marks', desc = 'All Marks' }, { 'mn', group = 'Next Bookmark Group' }, { 'mn1', "lua require('marks').next_bookmark1()", desc = 'Next Bookmark 1' }, { 'mn2', "lua require('marks').next_bookmark2()", desc = 'Next Bookmark 2' }, { 'mn3', "lua require('marks').next_bookmark3()", desc = 'Next Bookmark 3' }, { 'mn4', "lua require('marks').next_bookmark4()", desc = 'Next Bookmark 4' }, { 'mp', group = 'Previous Bookmark Group' }, { 'mp1', "lua require('marks').prev_bookmark1()", desc = 'Previous Bookmark 1' }, { 'mp2', "lua require('marks').prev_bookmark2()", desc = 'Previous Bookmark 2' }, { 'mp3', "lua require('marks').prev_bookmark3()", desc = 'Previous Bookmark 3' }, { 'mp4', "lua require('marks').prev_bookmark4()", desc = 'Previous Bookmark 4' }, { 'ms', "lua require('marks').set_next()", desc = 'Set Next' }, { 'mt', "lua require('marks').toggle()", desc = 'Toggle' }, { 'mx', "lua require('marks').delete_bookmark()", desc = 'Delete Bookmark' }, { 'n', group = ' Notes' }, { 'na', 'lua require("snacks").scratch.select()', desc = 'Select Scratch' }, { 'nc', 'lua require("tdo").run_with("commit " .. vim.fn.expand("%:p")) vim.notify("Committed!")', desc = 'Commit Note', }, { 'nd', 'Tdo', desc = "Today's Todo" }, { 'ne', 'TdoEntry', desc = "Today's Entry" }, { 'nf', 'TdoFiles', desc = 'All Notes' }, { 'ng', 'TdoFind', desc = 'Find Notes' }, { 'nh', 'Tdo -1', desc = "Yesterday's Todo" }, { 'nl', 'Tdo 1', desc = "Tomorrow's Todo" }, { 'nn', 'TdoNote', desc = 'New Note' }, { 'ns', 'lua require("snacks").scratch()', desc = 'New Scratch' }, { 'nt', 'TdoTodos', desc = 'Incomplete Todos' }, { 'nx', 'TdoToggle', desc = 'Toggle Todo' }, { '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' }, { 'p', group = ' Packages' }, { 'pc', 'Lazy check', desc = 'Check' }, { 'pd', 'Lazy debug', desc = 'Debug' }, { 'pe', 'lua require("snacks").profiler.scratch()', desc = 'Profiler Scratch' }, { 'pf', 'lua require("snacks").profiler.pick()', desc = 'Profiler Pick' }, { 'pi', 'Lazy install', desc = 'Install' }, { 'pl', 'Lazy log', desc = 'Log' }, { 'pm', 'Mason', desc = 'Mason' }, { 'pp', 'Lazy', desc = 'Plugins' }, { 'pP', 'Lazy profile', desc = 'Profile' }, { 'pr', 'Lazy restore', desc = 'Restore' }, { 'ps', 'Lazy sync', desc = 'Sync' }, { 'pt', 'lua require("snacks").profiler.toggle()', desc = 'Profiler Toggle' }, { 'pu', 'Lazy update', desc = 'Update' }, { 'px', 'Lazy clean', desc = 'Clean' }, { 'q', group = ' Quit' }, { 'qa', 'qall', desc = 'Quit All' }, { 'qb', 'bw', desc = 'Close Buffer' }, { 'qd', 'lua require("snacks").bufdelete()', 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' }, { 't`', 'Sterm', desc = 'Horizontal Terminal' }, { 'tc', 'Sterm bundle exec rails console', desc = 'Rails Console' }, { 'td', 'Sterm dexe', desc = 'Exe Launcher' }, { 'tn', 'Sterm node', desc = 'Node' }, { 'tp', 'Sterm bpython', desc = 'Python' }, { 'tr', 'Sterm irb', desc = 'Ruby' }, { 'ts', 'Sterm', desc = 'Horizontal Terminal' }, { 'tt', 'Fterm', desc = 'Terminal' }, { 'tv', 'Vterm', desc = 'Vertical Terminal' }, { 'tw', 'Sterm dexe --wait-before-exit', desc = 'Exe Launcher, Wait' }, { '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', 'Neotest output-panel', desc = 'Test Output' }, { 'us', 'Neotest summary', desc = 'Test Summary' }, { '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' }, { 'wd', 'lua require("snacks").dim.enable()', desc = 'Dim On' }, { 'wD', 'lua require("snacks").dim.disable()', desc = 'Dim Off' }, { 'wf', "lua require'utils'.sudo_write()", desc = 'Force Write' }, { 'wj', ']s', desc = 'Next Misspell' }, { 'wk', '[s', desc = 'Prev Misspell' }, { 'wn', 'WriteNoFormat', desc = 'Write Without Formatting' }, { 'wq', 'wq', desc = 'Write and Quit' }, { 'ws', 'Telescope spell_suggest', desc = 'Suggestions' }, { 'ww', 'w', desc = 'Write and Quit' }, { 'wz', 'lua require("snacks").zen.zen()', desc = 'Zen' }, { 'wZ', 'lua require("snacks").zen.zoom()', desc = 'Zoom' }, { 'x', 'x', desc = ' Save and Quit' }, { 'y', group = ' Yank' }, { 'yL', 'CopyAbsolutePathWithLine', desc = 'Absolute Path with Line' }, { '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' }, { 'yl', 'CopyRelativePathWithLine', desc = 'Relative Path with Line' }, { 'yp', 'CopyRelativePath', desc = 'Relative Path' }, } -- Jump to file mappings for i = 1, 9 do table.insert(normal_mappings, { string.format('f%d', i), string.format('LualineBuffersJump%d', i), desc = string.format('File %d', i), }) end local visual_mappings = { mode = 'v', { 'a', group = ' AI' }, { 'aF', 'CopilotChatFixDiagnostic', desc = 'Fix Diagnostic' }, { 'aG', 'CopilotChatCommitStaged', desc = 'Commit Staged' }, { 'ac', 'CopilotChatToggle', desc = 'Copilot Chat' }, { 'ad', 'CopilotChatDocs', desc = 'Docs' }, { 'ae', 'CopilotChatExplain', desc = 'Explain' }, { 'af', 'CopilotChatFix', desc = 'Fix' }, { 'ag', 'CopilotChatCommit', desc = 'Commit' }, { 'ao', 'CopilotChatOptimize', desc = 'Optimize' }, { 'ar', 'CopilotChatReview', desc = 'Review' }, { 'at', 'CopilotChatTests', desc = 'Tests' }, { 'c', group = ' Code' }, { 'ce', "'<,'>SnipRun", desc = 'Execute Selection' }, { 'cS', ':sort!', desc = 'Sort Desc' }, { 'ci', ':sort i', desc = 'Sort Case Insensitive' }, { 'cs', ':sort', desc = 'Sort Asc' }, { 'cu', ':!uniq', desc = 'Unique' }, { 'cx', ':lua', desc = 'Execute Lua' }, { 'g', group = ' Git' }, { 'ga', ":'<,'>Gitsigns stage_hunk", desc = 'Stage Hunk' }, { 'gr', ":'<,'>Gitsigns reset_hunk", desc = 'Reset Hunk' }, { 'gu', ":'<,'>Gitsigns undo_stage_hunk", desc = 'Undo Stage Hunk' }, { '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 +10', 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' }, { 'K', 'Lspsaga hover_doc', desc = 'LSP Hover' }, { 'Q', 'qall!', desc = 'Force Quit!' }, { 'U', 'redo', desc = 'Redo' }, { '[', group = ' Previous' }, { '[g', 'Gitsigns prev_hunk', desc = 'Git Hunk' }, { '[o', group = 'Textobjects' }, { ']', group = ' Next' }, { ']g', 'Gitsigns next_hunk', desc = 'Git Hunk' }, { ']o', group = 'Textobjects' }, } local tmux_mappings = { mode = 'n', { '', 'NavigatorLeft', desc = 'Move Left' }, { '', 'NavigatorDown', desc = 'Move Down' }, { '', 'NavigatorUp', desc = 'Move Up' }, { '', 'NavigatorRight', desc = 'Move Right' }, { '', 'NavigatorPrevious', desc = 'Previous Pane' }, } if vim.fn.exists('$TMUX') == 1 then vim.tbl_extend('force', no_leader_mappings, tmux_mappings) end local user_keybindings = require('lib.util').get_user_config('user_keybindings', {}) which_key.setup(setup) which_key.add(normal_mappings) which_key.add(visual_mappings) which_key.add(no_leader_mappings) which_key.add(user_keybindings)