diff --git a/config/nvim/lua/plugins/whichkey.lua b/config/nvim/lua/plugins/whichkey.lua index d672585..0e410d1 100644 --- a/config/nvim/lua/plugins/whichkey.lua +++ b/config/nvim/lua/plugins/whichkey.lua @@ -1,47 +1,20 @@ ----@class wk.Opts -local defaults = { - ---@type false | "classic" | "modern" | "helix" - preset = "classic", - -- Delay before showing the popup. Can be a number or a function that returns a number. - ---@type number | fun(ctx: { keys: string, mode: string, plugin?: string }):number - delay = function(ctx) - return ctx.plugin and 0 or 200 - end, - ---@param mapping wk.Mapping - filter = function(mapping) - -- example to exclude mappings without a description - -- return mapping.desc and mapping.desc ~= "" - return true - end, - --- You can add any mappings here, or use `require('which-key').add()` later - ---@type wk.Spec - spec = {}, - -- show a warning when issues were detected with your mappings - notify = true, - -- Which-key automatically sets up triggers for your mappings. - -- But you can disable this and setup the triggers manually. - -- Check the docs for more info. - ---@type wk.Spec - triggers = { - { "", mode = "nxsot" }, - }, - -- Start hidden and wait for a key to be pressed before showing the popup - -- Only used by enabled xo mapping modes. - ---@param ctx { mode: string, operator: string } - defer = function(ctx) - return ctx.mode == "V" or ctx.mode == "" - end, +local status_ok, which_key = pcall(require, "which-key") +if not status_ok then + return +end + +local setup = { plugins = { marks = true, -- shows a list of your marks on ' and ` registers = true, -- shows your registers on " in NORMAL or in INSERT mode - -- the presets plugin, adds help for a bunch of default keybindings in Neovim - -- No actual key bindings are created spelling = { enabled = true, -- enabling this will show WhichKey when pressing z= to select spelling suggestions suggestions = 20, -- how many suggestions should be shown in the list? }, + -- the presets plugin, adds help for a bunch of default keybindings in Neovim + -- No actual key bindings are created presets = { - operators = true, -- adds help for operators like d, y, ... + operators = false, -- adds help for operators like d, y, ... and registers them for motion / text object completion motions = true, -- adds help for motions text_objects = true, -- help for text objects triggered after entering an operator windows = true, -- default bindings on @@ -50,123 +23,165 @@ local defaults = { g = true, -- bindings for prefixed with g }, }, - ---@type wk.Win.opts - win = { - -- don't allow the popup to overlap with the cursor - no_overlap = true, - -- width = 1, - -- height = { min = 4, max = 25 }, - -- col = 0, - -- row = math.huge, - -- border = "none", - padding = { 1, 2 }, -- extra window padding [top/bottom, right/left] - title = true, - title_pos = "center", - zindex = 1000, - -- Additional vim.wo and vim.bo options - bo = {}, - wo = { - -- winblend = 10, -- value between 0-100 0 for fully opaque and 100 for fully transparent - }, - }, - layout = { - width = { min = 20 }, -- min and max width of the columns - spacing = 3, -- spacing between columns - }, - keys = { - scroll_down = "", -- binding to scroll down inside the popup - scroll_up = "", -- binding to scroll up inside the popup - }, - ---@type (string|wk.Sorter)[] - --- Mappings are sorted using configured sorters and natural sort of the keys - --- Available sorters: - --- * local: buffer-local mappings first - --- * order: order of the items (Used by plugins like marks / registers) - --- * group: groups last - --- * alphanum: alpha-numerical first - --- * mod: special modifier keys last - --- * manual: the order the mappings were added - --- * case: lower-case first - sort = { "local", "order", "group", "alphanum", "mod" }, - ---@type number|fun(node: wk.Node):boolean? - expand = 0, -- expand groups when <= n mappings - -- expand = function(node) - -- return not node.desc -- expand all nodes without a description - -- end, - -- Functions/Lua Patterns for formatting the labels - ---@type table - replace = { - key = { - function(key) - return require("which-key.view").format(key) - end, - -- { "", "SPC" }, - }, - desc = { - { "%(?(.*)%)?", "%1" }, - { "^%+", "" }, - { "<[cC]md>", "" }, - { "<[cC][rR]>", "" }, - { "<[sS]ilent>", "" }, - { "^lua%s+", "" }, - { "^call%s+", "" }, - { "^:%s*", "" }, - }, + -- add operators that will trigger motion and text object completion + -- to enable all native operators, set the preset / operators plugin above + -- operators = { gc = "Comments" }, + key_labels = { + -- override the label used to display some keys. It doesn't effect WK in any other way. + -- For example: + -- [""] = "SPC", + -- [""] = "RET", + -- [""] = "TAB", }, icons = { breadcrumb = "»", -- symbol used in the command line area that shows your active key combo separator = "➜", -- symbol used between a key and it's label group = "+", -- symbol prepended to a group - ellipsis = "…", - -- set to false to disable all mapping icons, - -- both those explicitely added in a mapping - -- and those from rules - mappings = true, - --- See `lua/which-key/icons.lua` for more details - --- Set to `false` to disable keymap icons from rules - ---@type wk.IconRule[]|false - rules = {}, - -- use the highlights from mini.icons - -- When `false`, it will use `WhichKeyIcon` instead - colors = true, - -- used by key format - keys = { - Up = " ", - Down = " ", - Left = " ", - Right = " ", - C = "󰘴 ", - M = "󰘵 ", - D = "󰘳 ", - S = "󰘶 ", - CR = "󰌑 ", - Esc = "󱊷 ", - ScrollWheelDown = "󱕐 ", - ScrollWheelUp = "󱕑 ", - NL = "󰌑 ", - BS = "󰁮", - Space = "󱁐 ", - Tab = "󰌒 ", - F1 = "󱊫", - F2 = "󱊬", - F3 = "󱊭", - F4 = "󱊮", - F5 = "󱊯", - F6 = "󱊰", - F7 = "󱊱", - F8 = "󱊲", - F9 = "󱊳", - F10 = "󱊴", - F11 = "󱊵", - F12 = "󱊶", + }, + popup_mappings = { + scroll_down = "", -- binding to scroll down inside the popup + scroll_up = "", -- binding to scroll up inside the popup + }, + window = { + border = "rounded", -- none, single, double, shadow + position = "bottom", -- bottom, top + margin = { 1, 0, 1, 0 }, -- extra window margin [top, right, bottom, left] + padding = { 2, 2, 2, 2 }, -- extra window padding [top, right, bottom, left] + winblend = 0, + }, + layout = { + height = { min = 4, max = 25 }, -- min and max height of the columns + width = { min = 20, max = 50 }, -- min and max width of the columns + spacing = 3, -- spacing between columns + align = "left", -- align columns left, center or right + }, + ignore_missing = true, -- enable this to hide mappings for which you didn't specify a label + hidden = { "", "", "", "", "call", "lua", "^:", "^ " }, -- hide mapping boilerplate + show_help = true, -- show help message on the command line when the popup is visible + triggers = "auto", -- automatically setup triggers + -- triggers = {""} -- or specify a list manually + triggers_blacklist = { + -- list of mode / prefixes that should never be hooked by WhichKey + -- this is mostly relevant for key maps that start with a native binding + -- most people should not need to change this + i = { "j", "k" }, + v = { "j", "k" }, + }, +} + +local opts = { + mode = "n", -- NORMAL mode + prefix = "", + buffer = nil, -- Global mappings. Specify a buffer number for buffer local mappings + silent = true, -- use `silent` when creating keymaps + noremap = true, -- use `noremap` when creating keymaps + nowait = true, -- use `nowait` when creating keymaps +} + +local mappings = { + ["a"] = { "Alpha", "Alpha" }, + ["b"] = { + "lua require('telescope.builtin').buffers(require('telescope.themes').get_dropdown{previewer = false})", + "Buffers", + }, + ["e"] = { "NvimTreeToggle", "Explorer" }, + ["w"] = { "w!", "Save" }, + ["q"] = { "q!", "Quit" }, + ["c"] = { "Bdelete!", "Close Buffer" }, + ["h"] = { "nohlsearch", "No Highlight" }, + ["f"] = { + "lua require('telescope.builtin').find_files(require('telescope.themes').get_dropdown{previewer = false})", + "Find files", + }, + ["F"] = { "Telescope live_grep theme=ivy", "Find Text" }, + ["P"] = { "lua require('telescope').extensions.projects.projects()", "Projects" }, + + p = { + name = "Packer", + c = { "PackerCompile", "Compile" }, + i = { "PackerInstall", "Install" }, + s = { "PackerSync", "Sync" }, + S = { "PackerStatus", "Status" }, + u = { "PackerUpdate", "Update" }, + }, + + g = { + name = "Git", + g = { "lua _LAZYGIT_TOGGLE()", "Lazygit" }, + j = { "lua require 'gitsigns'.next_hunk()", "Next Hunk" }, + k = { "lua require 'gitsigns'.prev_hunk()", "Prev Hunk" }, + l = { "lua require 'gitsigns'.blame_line()", "Blame" }, + p = { "lua require 'gitsigns'.preview_hunk()", "Preview Hunk" }, + r = { "lua require 'gitsigns'.reset_hunk()", "Reset Hunk" }, + R = { "lua require 'gitsigns'.reset_buffer()", "Reset Buffer" }, + s = { "lua require 'gitsigns'.stage_hunk()", "Stage Hunk" }, + u = { + "lua require 'gitsigns'.undo_stage_hunk()", + "Undo Stage Hunk", + }, + o = { "Telescope git_status", "Open changed file" }, + b = { "Telescope git_branches", "Checkout branch" }, + c = { "Telescope git_commits", "Checkout commit" }, + d = { + "Gitsigns diffthis HEAD", + "Diff", }, }, - show_help = true, -- show a help message in the command line for using WhichKey - show_keys = true, -- show the currently pressed key and its label as a message in the command line - -- disable WhichKey for certain buf types and file types. - disable = { - ft = {}, - bt = {}, + + l = { + name = "LSP", + a = { "lua vim.lsp.buf.code_action()", "Code Action" }, + d = { + "Telescope diagnostics bufnr=0", + "Document Diagnostics", + }, + w = { + "Telescope diagnostics", + "Workspace Diagnostics", + }, + f = { "lua vim.lsp.buf.format{async=true}", "Format" }, + i = { "LspInfo", "Info" }, + I = { "LspInstallInfo", "Installer Info" }, + j = { + "lua vim.lsp.diagnostic.goto_next()", + "Next Diagnostic", + }, + k = { + "lua vim.lsp.diagnostic.goto_prev()", + "Prev Diagnostic", + }, + l = { "lua vim.lsp.codelens.run()", "CodeLens Action" }, + q = { "lua vim.diagnostic.setloclist()", "Quickfix" }, + r = { "lua vim.lsp.buf.rename()", "Rename" }, + s = { "Telescope lsp_document_symbols", "Document Symbols" }, + S = { + "Telescope lsp_dynamic_workspace_symbols", + "Workspace Symbols", + }, + }, + s = { + name = "Search", + b = { "Telescope git_branches", "Checkout branch" }, + c = { "Telescope colorscheme", "Colorscheme" }, + h = { "Telescope help_tags", "Find Help" }, + M = { "Telescope man_pages", "Man Pages" }, + r = { "Telescope oldfiles", "Open Recent File" }, + R = { "Telescope registers", "Registers" }, + k = { "Telescope keymaps", "Keymaps" }, + C = { "Telescope commands", "Commands" }, + }, + + t = { + name = "Terminal", + n = { "lua _NODE_TOGGLE()", "Node" }, + u = { "lua _NCDU_TOGGLE()", "NCDU" }, + t = { "lua _HTOP_TOGGLE()", "Htop" }, + p = { "lua _PYTHON_TOGGLE()", "Python" }, + f = { "ToggleTerm direction=float", "Float" }, + h = { "ToggleTerm size=10 direction=horizontal", "Horizontal" }, + v = { "ToggleTerm size=80 direction=vertical", "Vertical" }, }, - debug = false, -- enable wk.log in the current directory } + +which_key.setup(setup) +which_key.register(mappings, opts)