-- Useful plugin to show you pending keybinds. -- https://github.com/folke/which-key.nvim return { 'folke/which-key.nvim', lazy = false, version = '*', priority = 1001, -- Make sure to load this as soon as possible dependencies = { 'nvim-lua/plenary.nvim', 'echasnovski/mini.icons', }, config = function() local wk = require 'which-key' wk.setup() wk.add { -- ╭─────────────────────────────────────────────────────────╮ -- │ With leader │ -- ╰─────────────────────────────────────────────────────────╯ -- ── Buffer ────────────────────────────────────────────────────────── { 'b', group = '[b] Buffer', -- Add the current buffers to the menu expand = function() return require('which-key.extras').expand.buf() end, }, { { 'bk', 'blast', desc = 'Buffer: Last' }, { 'bj', 'bfirst', desc = 'Buffer: First' }, { 'bh', 'bprev', desc = 'Buffer: Prev' }, { 'bl', 'bnext', desc = 'Buffer: Next' }, { 'bd', 'Bdelete', desc = 'Buffer: Delete' }, { 'bw', 'Bwipeout', desc = 'Buffer: Wipeout' }, }, -- ── Code ──────────────────────────────────────────────────────────── { 'c', group = '[c] Code' }, { 'ca', 'lua vim.lsp.buf.code_action()', desc = 'LSP: Code Action' }, { 'cg', 'lua require("neogen").generate()', desc = 'Generate annotations' }, -- Code: treesj { 'cc', group = 'Code Split/Join' }, -- see: lua/plugins/treesj.lua { 'cct', 'TSJToggle', desc = 'Split/Join: Toggle' }, { 'ccs', 'TSJSplit', desc = 'Split/Join: Split' }, { 'ccj', 'TSJJoin', desc = 'Split/Join: Join' }, -- ── Code: CommentBox ──────────────────────────────────────────────── { 'cb', group = 'CommentBox' }, { 'cbb', 'CBccbox', desc = 'CommentBox: Box Title' }, { 'cbd', 'CBd', desc = 'CommentBox: Remove a box' }, { 'cbl', 'CBline', desc = 'CommentBox: Simple Line' }, { 'cbm', 'CBllbox14', desc = 'CommentBox: Marked' }, { 'cbt', 'CBllline', desc = 'CommentBox: Titled Line' }, -- ── Code: Refactoring ─────────────────────────────────────────────── { 'cx', group = '[x] Refactoring' }, { mode = { 'x' }, -- Extract function supports only visual mode { 'cxe', "lua require('refactoring').refactor('Extract Function')", desc = 'Extract Function', }, { 'cxf', "lua require('refactoring').refactor('Extract Function To File')", desc = 'Extract Function to File', }, -- Extract variable supports only visual mode { 'cxv', "lua require('refactoring').refactor('Extract Variable')", desc = 'Extract Variable', }, }, -- Inline func supports only normal { 'cxif', "lua require('refactoring').refactor('Inline Function')", desc = 'Inline Function', }, -- Extract block supports only normal mode { 'cxb', "lua require('refactoring').refactor('Extract Block')", desc = 'Extract Block', }, { 'cxbf', "lua require('refactoring').refactor('Extract Block To File')", desc = 'Extract Block to File', }, { mode = { 'n', 'x' }, -- Inline var supports both normal and visual mode { 'cxiv', "lua require('refactoring').refactor('Inline Variable')", desc = 'Inline Variable', }, }, -- ── Code: LSPSaga ─────────────────────────────────────────────────── -- See: lua/plugins/lsp.lua { '', 'Lspsaga term_toggle', desc = 'LSPSaga: Open Floaterm', }, { 'ca', 'Lspsaga code_action', desc = 'LSPSaga: Code Actions', }, { 'cci', 'Lspsaga incoming_calls', desc = 'LSPSaga: Incoming Calls', }, { 'cco', 'Lspsaga outgoing_calls', desc = 'LSPSaga: Outgoing Calls', }, { 'cd', 'Lspsaga show_line_diagnostics', desc = 'LSPSaga: Show Line Diagnostics', }, { 'cf', 'lua require("conform").format({ async = true, lsp_fallback = true })', mode = { 'n', 'v' }, desc = 'Format buffer', }, { 'ci', 'Lspsaga implement', desc = 'LSPSaga: Implementations', }, { 'cl', 'Lspsaga show_cursor_diagnostics', desc = 'LSPSaga: Show Cursor Diagnostics', }, { 'cp', 'Lspsaga peek_definition', desc = 'LSPSaga: Peek Definition', }, { 'cr', 'Lspsaga rename', desc = 'LSPSaga: Rename' }, { 'cR', 'Lspsaga rename ++project', desc = 'LSPSaga: Rename Project wide', }, { 'cs', 'Lspsaga signature_help', desc = 'LSPSaga: Signature Documentation', }, { 'ct', 'Lspsaga peek_type_definition', desc = 'LSPSaga: Peek Type Definition', }, { 'cu', 'Lspsaga preview_definition', desc = 'LSPSaga: Preview Definition', }, { 'cv', 'Lspsaga diagnostic_jump_prev', desc = 'LSPSaga: Diagnostic Jump Prev', }, { 'cw', 'Lspsaga diagnostic_jump_next', desc = 'LSPSaga: Diagnostic Jump Next', }, -- ── DAP ───────────────────────────────────────────────────────────── { 'd', group = '[d] DAP' }, { { 'db', 'DapToggleBreakpoint', desc = 'DAP: Toggle Breakpoint', }, { 'dc', 'DapContinue', desc = 'DAP: Continue' }, { 'do', 'lua vim.diagnostic.open_float()', desc = 'Diagnostic: Open float', }, { 'dq', 'lua vim.diagnostic.setloclist()', desc = 'Diagnostic: Set loc list', }, { 'dr', "lua require('dapui').open({reset = true})", desc = 'DAP: Reset', }, { 'ds', 'lua require("telescope.builtin").lsp_document_symbols()', desc = 'LSP: Document Symbols', }, { 'dt', 'DapUiToggle', desc = 'DAP: Toggle UI' }, }, -- ── Harpoon ───────────────────────────────────────────────────────── -- See: lua/plugins/telescope.lua { 'h', group = '[h] Harpoon' }, { { 'ha', 'lua require("harpoon"):list():add()', desc = 'harpoon file', }, { 'hn', 'lua require("harpoon"):list():next()', desc = 'harpoon to next file', }, { 'hp', 'lua require("harpoon"):list():prev()', desc = 'harpoon to previous file', }, { 'ht', "lua require('harpoon.ui').toggle_quick_menu()", desc = 'DAP: Harpoon UI', }, }, -- ── LSP ───────────────────────────────────────────────────────────── { 'l', group = '[l] LSP' }, -- See: lua/plugins/lsp.lua -- ── Quit ──────────────────────────────────────────────────────────── { 'q', group = '[q] Quit' }, { { 'qf', 'q', desc = 'Quicker close split' }, { 'qq', 'wq!', desc = 'Quit with force saving' }, { 'qw', 'wq', desc = 'Write and quit' }, }, -- ── Search ────────────────────────────────────────────────────────── { 's', group = '[s] Search' }, -- See: lua/plugins/telescope.lua { '', "lua require('telescope.builtin').buffers()", desc = 'Find existing buffers', }, { '', "lua require('telescope.builtin').commands()", desc = 'Telescope: Commands', }, { 'sd', "lua require('telescope.builtin').diagnostics()", desc = 'Search Diagnostics', }, { 'sg', "lua require('telescope.builtin').live_grep()", desc = 'Search by Grep', }, { 'sm', 'Telescope harpoon marks', desc = 'Harpoon Marks', }, { 'sn', "lua require('telescope').extensions.notify.notify()", desc = 'Show Notifications', }, { 'so', "lua require('telescope.builtin').oldfiles()", desc = 'Find recently Opened files', }, { 'sp', "lua require('telescope').extensions.lazy_plugins.lazy_plugins()", desc = 'Find neovim/lazy configs', }, { 'st', 'TodoTelescope', desc = 'Telescope: Show Todo' }, { 'sw', "lua require('telescope.builtin').grep_string()", desc = 'Search current Word', }, -- ── Toggle ────────────────────────────────────────────────────────── { 't', group = '[t] Toggle' }, { { 'tc', 'CloakToggle', desc = 'Toggle Cloak' }, { 'tn', 'Noice dismiss', desc = 'Noice dismiss' }, { 'ts', 'noh', desc = 'Toggle Search Highlighting' }, { 'tt', 'TransparentToggle', desc = 'Toggle Transparency', }, { 'tw', 'Twilight', desc = 'Toggle Twilight' }, }, -- ── Workspace ─────────────────────────────────────────────────────── { 'w', group = '[w] Workspace' }, { { 'wa', 'lua vim.lsp.buf.add_workspace_folder()', desc = 'LSP: Workspace Add Folder', }, { 'wl', 'lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))', desc = 'LSP: Workspace List Folders', }, { 'wr', 'lua vim.lsp.buf.remove_workspace_folder()', desc = 'LSP: Workspace Remove Folder', }, { 'ws', 'lua require("telescope.builtin").lsp_dynamic_workspace_symbols()', desc = 'LSP: Workspace Symbols', }, }, -- ── Trouble ───────────────────────────────────────────────────────── { 'x', group = '[x] Trouble' }, { { 'xx', 'Trouble diagnostics', desc = 'Toggle Trouble Diagnostics', }, { 'xw', 'Trouble workspace_diagnostics', desc = 'Toggle Workspace Diagnostics', }, { 'xd', 'Trouble document_diagnostics', desc = 'Toggle Document Diagnostics', }, { 'xl', 'Trouble loclist', desc = 'Toggle Loclist' }, { 'xq', 'Trouble quickfix', desc = 'Toggle Quickfix' }, }, -- ── Help ──────────────────────────────────────────────────────────── { '?', group = '[?] Help & Cheat sheets' }, { { '?w', 'lua require("which-key").show({global = false})', desc = 'Buffer Local Keymaps (which-key)', }, }, -- ── Misc ──────────────────────────────────────────────────────────── { 'D', 'lua vim.lsp.buf.type_definition()', desc = 'LSP: Type Definition' }, { 'e', 'Neotree reveal', desc = 'NeoTree reveal' }, -- ╭─────────────────────────────────────────────────────────╮ -- │ Without leader │ -- ╰─────────────────────────────────────────────────────────╯ { 'y', group = 'Yank & Surround' }, { 'gp', group = 'Goto Preview' }, { { 'gpd', 'lua require("goto-preview").goto_preview_definition()', desc = 'Goto: Preview Definition', }, { 'gpi', 'lua require("goto-preview").goto_preview_implementation()', desc = 'Goto: Preview Implementation', }, { 'gpP', 'lua require("goto-preview").close_all_windows()', desc = 'Goto: Close All Preview Windows', }, }, -- ── tmux navigation ───────────────────────────────────────────────── { { '', 'TmuxNavigateLeft', desc = 'tmux: Navigate Left', }, { '', 'TmuxNavigateDown', desc = 'tmux: Navigate Down', }, { '', 'TmuxNavigateUp', desc = 'tmux: Navigate Up' }, { '', 'TmuxNavigateRight', desc = 'tmux: Navigate Right', }, { '', 'TmuxNavigatePrevious', desc = 'tmux: Navigate Previous', }, }, -- ── Old habits ────────────────────────────────────────────────────── { '', 'w', desc = 'Save file' }, -- ── Text manipulation in visual mode ──────────────────────────────── { mode = 'v', { '>', '>gv', desc = 'Indent Right' }, { '<', 'm '>+1gv=gv", desc = 'Move Block Down' }, { 'K', "m '<-2gv=gv", desc = 'Move Block Up' }, }, -- ── LSP ───────────────────────────────────────────────────────────── { '', 'lua vim.lsp.buf.signature_help()', desc = 'LSP: Signature Documentation', }, { 'K', 'Lspsaga hover_doc', desc = 'LSPSaga: Hover Documentation', }, { 'd', group = 'Diagnostics' }, { { 'dn', 'lua vim.diagnostic.goto_next()', desc = 'Diagnostic: Goto Next', }, { 'dp', 'lua vim.diagnostic.goto_prev()', desc = 'Diagnostic: Goto Prev', }, }, { { 'g', group = 'Goto' }, { 'gD', 'lua vim.lsp.buf.declaration()', desc = 'LSP: Goto Declaration', }, { 'gI', 'lua vim.lsp.buf.implementation()', desc = 'LSP: Goto Implementation', }, { 'gR', 'Trouble lsp_references', desc = 'Toggle LSP References', }, { 'gd', 'lua vim.lsp.buf.definition()', desc = 'LSP: Goto Definition', }, { 'gr', 'lua require("telescope.builtin").lsp_references()', desc = 'LSP: Goto References', }, }, -- ── Misc keybinds ─────────────────────────────────────────────────── -- Sublime-like shortcut 'go to file' ctrl+p. { '', 'Telescope find_files', desc = 'Search for files starting at current directory.', }, { 'QQ', 'q!', desc = 'Quit without saving' }, { 'WW', 'w!', desc = 'Force write to file' }, { 'ss', 'noh', desc = 'Clear Search Highlighting' }, { 'jj', '', desc = 'Esc without touching esc in insert mode', mode = 'i', }, -- ── Splits ────────────────────────────────────────────────────────── -- Use CTRL+ to switch between windows in normal mode -- See `:help wincmd` for a list of all window commands { '', '', desc = 'Move focus to the left window' }, { '', '', desc = 'Move focus to the right window' }, { '', '', desc = 'Move focus to the lower window' }, { '', '', desc = 'Move focus to the upper window' }, -- Split resizing { ',', 'vertical resize -10', desc = 'V Resize -' }, { '.', 'vertical resize +10', desc = 'V Resize +' }, -- ── Disable arrow keys in normal mode ─────────────────────────────── { '', 'echo "Use h to move!!"' }, { '', 'echo "Use l to move!!"' }, { '', 'echo "Use k to move!!"' }, { '', 'echo "Use j to move!!"' }, -- ── Terminal ──────────────────────────────────────────────────────── -- Exit terminal mode in the builtin terminal with a shortcut that is -- a bit easier for people to discover. Otherwise, you normally need -- to press , which is not what someone will guess without -- a bit more experience. -- -- NOTE: This won't work in all terminal emulators/tmux/etc. -- Try your own mapping or just use to exit terminal mode. { '', '', desc = 'Exit terminal mode', mode = 't' }, -- ── Search ────────────────────────────────────────────────────────── -- :noh if you have search highlights { '', 'noh', desc = 'Clear search highlights' }, } end, }