-- 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', expand = function() return require('which-key.extras').expand.buf() end, }, { 'bk', ':blast', desc = 'Buffer: Last', mode = 'n' }, { 'bj', ':bfirst', desc = 'Buffer: First', mode = 'n' }, { 'bh', ':bprev', desc = 'Buffer: Prev', mode = 'n' }, { 'bl', ':bnext', desc = 'Buffer: Next', mode = 'n' }, { 'bd', ':Bdelete', desc = 'Buffer: Delete', mode = 'n' }, { 'bw', ':Bwipeout', desc = 'Buffer: Wipeout', mode = 'n' }, -- ── Code ──────────────────────────────────────────────────────────── { 'c', group = '[c] Code' }, { 'ca', 'lua vim.lsp.buf.code_action()', desc = 'LSP: Code Action' }, { 'cr', 'lua vim.lsp.buf.rename()', desc = 'LSP: Rename' }, { 'cg', 'lua require("neogen").generate()', desc = 'Generate annotations' }, -- ── 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: package.json control -- See: lua/plugins/lazy.lua { 'cn', group = 'package.json control' }, { 'cnd', 'lua require("package-info").delete()', desc = 'Delete package' }, { 'cni', 'lua require("package-info").install()', desc = 'Install package' }, { 'cns', 'lua require("package-info").show({ force = true })', desc = 'Show package info' }, { 'cnu', 'lua require("package-info").change_version()', desc = 'Change version' }, -- 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', 'Lspsaga lsp_finder', desc = 'LSPSaga: LSP Finder' }, { '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 ───────────────────────────────────────────────────────── { 'h', group = '[h] Harpoon' }, -- See: lua/plugins/harpoon.lua { '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 -- ── 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', desc = 'Toggle Trouble' }, { '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' }, -- ── FZF ───────────────────────────────────────────────────────────── { 'z', group = '[z] FZF' }, -- Stolen from https://github.com/erikw/dotfiles/blob/d68d6274d67ac47afa20b9a0b9f3b0fa54bcdaf3/.config/nvim/lua/plugins.lua { 'zf', ':FZF', desc = 'FZF: search for files in given path.' }, { 'zc', ':Commands', desc = 'FZF: search commands.' }, { 'zt', ':Tags', desc = 'FZF: search in tags file' }, { 'zb', ':Buffers', desc = 'FZF: search open buffers.' }, -- Ref: https://medium.com/@paulodiovani/vim-buffers-windows-and-tabs-an-overview-8e2a57c57afa { 'zt', ':Windows', desc = 'FZF: search open tabs.' }, { 'zh', ':History', desc = 'FZF: search history of opened files' }, { 'zm', ':Maps', desc = 'FZF: search mappings.' }, { 'zg', ':Rg', desc = 'FZF: search with rg (aka live grep).' }, -- ── Help & Neoconf ────────────────────────────────────────────────── { '?', group = '[?] Help & neoconf' }, { '?c', 'Neoconf', desc = 'Neoconf: Open' }, { '?g', 'Neoconf global', desc = 'Neoconf: Global' }, { '?l', 'Neoconf local', desc = 'Neoconf: Local' }, { '?m', 'Neoconf lsp', desc = 'Neoconf: Show merged LSP config' }, { '?s', 'Neoconf show', desc = 'Neoconf: Show merged config' }, { '?w', 'lua require("which-key").show({global = false})', desc = 'Buffer Local Keymaps (which-key)' }, -- ── Misc ──────────────────────────────────────────────────────────── { '1', 'lua require("harpoon"):list():select(1)', desc = 'harpoon to file 1' }, { '2', 'lua require("harpoon"):list():select(2)', desc = 'harpoon to file 2' }, { '3', 'lua require("harpoon"):list():select(3)', desc = 'harpoon to file 3' }, { '4', 'lua require("harpoon"):list():select(4)', desc = 'harpoon to file 4' }, { '5', 'lua require("harpoon"):list():select(5)', desc = 'harpoon to file 5' }, { '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()' }, { 'gpi', 'lua require("goto-preview").goto_preview_implementation()' }, { 'gpP', 'lua require("goto-preview").close_all_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 ──────────────────────────────── { '>', '>gv', desc = 'Indent Right', mode = 'v' }, { '<', '+1gv=gv", desc = 'Move Block Down', mode = 'v' }, { 'K', ":m '<-2gv=gv", desc = 'Move Block Up', mode = 'v' }, -- ── LSP ───────────────────────────────────────────────────────────── { '', 'lua vim.lsp.buf.signature_help()', desc = 'LSP: Signature Documentation' }, { 'K', 'Lspsaga hover_doc', desc = 'LSPSaga: Hover Documentation' }, { 'dn', 'lua vim.diagnostic.goto_next()', desc = 'Diagnostic: Goto Next' }, { 'dp', 'lua vim.diagnostic.goto_prev()', desc = 'Diagnostic: Goto Prev' }, { '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. { '', ':Files', desc = 'FZF: 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, }