[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-70608":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":15,"stars7d":14,"stars30d":17,"stars90d":16,"forks30d":16,"starsTrendScore":18,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":29,"readmeContent":30,"aiSummary":31,"trendingCount":16,"starSnapshotCount":16,"syncStatus":32,"lastSyncTime":33,"discoverSource":34},70608,"which-key.nvim","folke\u002Fwhich-key.nvim","folke","💥   Create key bindings that stick. WhichKey helps you remember your Neovim keymaps, by showing available keybindings in a popup as you type.","",null,"Lua",7176,257,15,7,0,62,21,90.93,"Apache License 2.0",false,"main",true,[25,26,27,28],"lua","neovim","neovim-lua","neovim-plugin","2026-06-12 04:00:56","# 💥 Which Key\n\n**WhichKey** helps you remember your Neovim keymaps, by showing available keybindings\nin a popup as you type.\n\n![image](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F89277334-dcdc-4b0f-9fd4-02f27012f589)\n![image](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Ff8d71a75-312e-4a42-add8-d153493b2633)\n![image](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fe4400a1d-7e71-4439-b6ff-6cbc40647a6f)\n\n## ✨ Features\n\n- 🔍 **Key Binding Help**: show available keybindings in a popup as you type.\n- ⌨️ **Modes**: works in normal, insert, visual, operator pending, terminal and command mode.\n  Every mode can be enabled\u002Fdisabled.\n- 🛠️ **Customizable Layouts**: choose from `classic`, `modern`, and `helix` presets or customize the window.\n- 🔄 **Flexible Sorting**: sort by `local`, `order`, `group`, `alphanum`, `mod`, `lower`, `icase`, `desc`, or `manual`.\n- 🎨 **Formatting**: customizable key labels and descriptions\n- 🖼️ **Icons**: integrates with [mini.icons](https:\u002F\u002Fgithub.com\u002Fechasnovski\u002Fmini.icons) and [nvim-web-devicons](https:\u002F\u002Fgithub.com\u002Fnvim-tree\u002Fnvim-web-devicons)\n- ⏱️ **Delay**: delay is independent of `timeoutlen`\n- 🌐 **Plugins**: built-in plugins for marks, registers, presets, and spelling suggestions\n- 🚀 **Operators, Motions, Text Objects**: help for operators, motions and text objects\n- 🐙 **Hydra Mode**: keep the popup open until you hit `\u003Cesc>`\n\n## ⚡️ Requirements\n\n- **Neovim** >= 0.9.4\n- for proper icons support:\n  - [mini.icons](https:\u002F\u002Fgithub.com\u002Fechasnovski\u002Fmini.icons) _(optional)_\n  - [nvim-web-devicons](https:\u002F\u002Fgithub.com\u002Fnvim-tree\u002Fnvim-web-devicons) _(optional)_\n  - a [Nerd Font](https:\u002F\u002Fwww.nerdfonts.com\u002F) **_(optional)_**\n\n## 📦 Installation\n\nInstall the plugin with your package manager:\n\n### [lazy.nvim](https:\u002F\u002Fgithub.com\u002Ffolke\u002Flazy.nvim)\n\n```lua\n{\n  \"folke\u002Fwhich-key.nvim\",\n  event = \"VeryLazy\",\n  opts = {\n    -- your configuration comes here\n    -- or leave it empty to use the default settings\n    -- refer to the configuration section below\n  },\n  keys = {\n    {\n      \"\u003Cleader>?\",\n      function()\n        require(\"which-key\").show({ global = false })\n      end,\n      desc = \"Buffer Local Keymaps (which-key)\",\n    },\n  },\n}\n```\n\n## ⚙️ Configuration\n\n> [!important]\n> Make sure to run `:checkhealth which-key` if something isn't working properly\n\n**WhichKey** is highly configurable. Expand to see the list of all the default options below.\n\n\u003Cdetails>\u003Csummary>Default Options\u003C\u002Fsummary>\n\n\u003C!-- config:start -->\n\n```lua\n---@class wk.Opts\nlocal defaults = {\n  ---@type false | \"classic\" | \"modern\" | \"helix\"\n  preset = \"classic\",\n  -- Delay before showing the popup. Can be a number or a function that returns a number.\n  ---@type number | fun(ctx: { keys: string, mode: string, plugin?: string }):number\n  delay = function(ctx)\n    return ctx.plugin and 0 or 200\n  end,\n  ---@param mapping wk.Mapping\n  filter = function(mapping)\n    -- example to exclude mappings without a description\n    -- return mapping.desc and mapping.desc ~= \"\"\n    return true\n  end,\n  --- You can add any mappings here, or use `require('which-key').add()` later\n  ---@type wk.Spec\n  spec = {},\n  -- show a warning when issues were detected with your mappings\n  notify = true,\n  -- Which-key automatically sets up triggers for your mappings.\n  -- But you can disable this and setup the triggers manually.\n  -- Check the docs for more info.\n  ---@type wk.Spec\n  triggers = {\n    { \"\u003Cauto>\", mode = \"nxso\" },\n  },\n  -- Start hidden and wait for a key to be pressed before showing the popup\n  -- Only used by enabled xo mapping modes.\n  ---@param ctx { mode: string, operator: string }\n  defer = function(ctx)\n    return ctx.mode == \"V\" or ctx.mode == \"\u003CC-V>\"\n  end,\n  plugins = {\n    marks = true, -- shows a list of your marks on ' and `\n    registers = true, -- shows your registers on \" in NORMAL or \u003CC-r> in INSERT mode\n    -- the presets plugin, adds help for a bunch of default keybindings in Neovim\n    -- No actual key bindings are created\n    spelling = {\n      enabled = true, -- enabling this will show WhichKey when pressing z= to select spelling suggestions\n      suggestions = 20, -- how many suggestions should be shown in the list?\n    },\n    presets = {\n      operators = true, -- adds help for operators like d, y, ...\n      motions = true, -- adds help for motions\n      text_objects = true, -- help for text objects triggered after entering an operator\n      windows = true, -- default bindings on \u003Cc-w>\n      nav = true, -- misc bindings to work with windows\n      z = true, -- bindings for folds, spelling and others prefixed with z\n      g = true, -- bindings for prefixed with g\n    },\n  },\n  ---@type wk.Win.opts\n  win = {\n    -- don't allow the popup to overlap with the cursor\n    no_overlap = true,\n    -- width = 1,\n    -- height = { min = 4, max = 25 },\n    -- col = 0,\n    -- row = math.huge,\n    -- border = \"none\",\n    padding = { 1, 2 }, -- extra window padding [top\u002Fbottom, right\u002Fleft]\n    title = true,\n    title_pos = \"center\",\n    zindex = 1000,\n    -- Additional vim.wo and vim.bo options\n    bo = {},\n    wo = {\n      -- winblend = 10, -- value between 0-100 0 for fully opaque and 100 for fully transparent\n    },\n  },\n  layout = {\n    width = { min = 20 }, -- min and max width of the columns\n    spacing = 3, -- spacing between columns\n  },\n  keys = {\n    scroll_down = \"\u003Cc-d>\", -- binding to scroll down inside the popup\n    scroll_up = \"\u003Cc-u>\", -- binding to scroll up inside the popup\n  },\n  ---@type (string|wk.Sorter)[]\n  --- Mappings are sorted using configured sorters and natural sort of the keys\n  --- Available sorters:\n  --- * local: buffer-local mappings first\n  --- * order: order of the items (Used by plugins like marks \u002F registers)\n  --- * group: groups last\n  --- * alphanum: alpha-numerical first\n  --- * mod: special modifier keys last\n  --- * manual: the order the mappings were added\n  --- * case: lower-case first\n  sort = { \"local\", \"order\", \"group\", \"alphanum\", \"mod\" },\n  ---@type number|fun(node: wk.Node):boolean?\n  expand = 0, -- expand groups when \u003C= n mappings\n  -- expand = function(node)\n  --   return not node.desc -- expand all nodes without a description\n  -- end,\n  -- Functions\u002FLua Patterns for formatting the labels\n  ---@type table\u003Cstring, ({[1]:string, [2]:string}|fun(str:string):string)[]>\n  replace = {\n    key = {\n      function(key)\n        return require(\"which-key.view\").format(key)\n      end,\n      -- { \"\u003CSpace>\", \"SPC\" },\n    },\n    desc = {\n      { \"\u003CPlug>%(?(.*)%)?\", \"%1\" },\n      { \"^%+\", \"\" },\n      { \"\u003C[cC]md>\", \"\" },\n      { \"\u003C[cC][rR]>\", \"\" },\n      { \"\u003C[sS]ilent>\", \"\" },\n      { \"^lua%s+\", \"\" },\n      { \"^call%s+\", \"\" },\n      { \"^:%s*\", \"\" },\n    },\n  },\n  icons = {\n    breadcrumb = \"»\", -- symbol used in the command line area that shows your active key combo\n    separator = \"➜\", -- symbol used between a key and it's label\n    group = \"+\", -- symbol prepended to a group\n    ellipsis = \"…\",\n    -- set to false to disable all mapping icons,\n    -- both those explicitly added in a mapping\n    -- and those from rules\n    mappings = true,\n    --- See `lua\u002Fwhich-key\u002Ficons.lua` for more details\n    --- Set to `false` to disable keymap icons from rules\n    ---@type wk.IconRule[]|false\n    rules = {},\n    -- use the highlights from mini.icons\n    -- When `false`, it will use `WhichKeyIcon` instead\n    colors = true,\n    -- used by key format\n    keys = {\n      Up = \" \",\n      Down = \" \",\n      Left = \" \",\n      Right = \" \",\n      C = \"󰘴 \",\n      M = \"󰘵 \",\n      D = \"󰘳 \",\n      S = \"󰘶 \",\n      CR = \"󰌑 \",\n      Esc = \"󱊷 \",\n      ScrollWheelDown = \"󱕐 \",\n      ScrollWheelUp = \"󱕑 \",\n      NL = \"󰌑 \",\n      BS = \"󰁮\",\n      Space = \"󱁐 \",\n      Tab = \"󰌒 \",\n      F1 = \"󱊫\",\n      F2 = \"󱊬\",\n      F3 = \"󱊭\",\n      F4 = \"󱊮\",\n      F5 = \"󱊯\",\n      F6 = \"󱊰\",\n      F7 = \"󱊱\",\n      F8 = \"󱊲\",\n      F9 = \"󱊳\",\n      F10 = \"󱊴\",\n      F11 = \"󱊵\",\n      F12 = \"󱊶\",\n    },\n  },\n  show_help = true, -- show a help message in the command line for using WhichKey\n  show_keys = true, -- show the currently pressed key and its label as a message in the command line\n  -- disable WhichKey for certain buf types and file types.\n  disable = {\n    ft = {},\n    bt = {},\n  },\n  debug = false, -- enable wk.log in the current directory\n}\n```\n\n\u003C!-- config:end -->\n\n\u003C\u002Fdetails>\n\n## ⌨️ Mappings\n\n**WhichKey** automatically gets the descriptions of your keymaps from the `desc`\nattribute of the keymap. So for most use-cases, you don't need to do anything else.\n\nHowever, the **mapping spec** is still useful to configure group descriptions and mappings that don't really exist as a regular keymap.\n\n> [!WARNING]\n> The **mappings spec** changed in `v3`, so make sure to only use the new `add` method if\n> you updated your existing mappings.\n\nMappings can be added as part of the config `opts.spec`, or can be added later\nusing `require(\"which-key\").add()`.\n`wk.add()` can be called multiple times from anywhere in your config files.\n\nA mapping has the following attributes:\n\n- **[1]**: (`string`) lhs **_(required)_**\n- **[2]**: (`string|fun()`) rhs **_(optional)_**: when present, it will create the mapping\n- **desc**: (`string|fun():string`) description **_(required for non-groups)_**\n- **group**: (`string|fun():string`) group name **_(optional)_**\n- **mode**: (`string|string[]`) mode **_(optional, defaults to `\"n\"`)_**\n- **cond**: (`boolean|fun():boolean`) condition to enable the mapping **_(optional)_**\n- **hidden**: (`boolean`) hide the mapping **_(optional)_**\n- **icon**: (`string|wk.Icon|fun():(wk.Icon|string)`) icon spec **_(optional)_**\n- **proxy**: (`string`) proxy to another mapping **_(optional)_**\n- **expand**: (`fun():wk.Spec`) nested mappings **_(optional)_**\n- any other option valid for `vim.keymap.set`. These are only used for creating mappings.\n\nWhen `desc`, `group`, or `icon` are functions, they are evaluated every time\nthe popup is shown.\n\nThe `expand` property allows to create dynamic mappings. Only functions as `rhs` are supported for dynamic mappings.\nTwo examples are included in `which-key.extras`:\n\n- `require(\"which-key.extras\").expand.buf`: creates numerical key to buffer mappings\n- `require(\"which-key.extras\").expand.win`: creates numerical key to window mappings\n\n```lua\nlocal wk = require(\"which-key\")\nwk.add({\n  { \"\u003Cleader>f\", group = \"file\" }, -- group\n  { \"\u003Cleader>ff\", \"\u003Ccmd>Telescope find_files\u003Ccr>\", desc = \"Find File\", mode = \"n\" },\n  { \"\u003Cleader>fb\", function() print(\"hello\") end, desc = \"Foobar\" },\n  { \"\u003Cleader>fn\", desc = \"New File\" },\n  { \"\u003Cleader>f1\", hidden = true }, -- hide this keymap\n  { \"\u003Cleader>w\", proxy = \"\u003Cc-w>\", group = \"windows\" }, -- proxy to window mappings\n  { \"\u003Cleader>b\", group = \"buffers\", expand = function()\n      return require(\"which-key.extras\").expand.buf()\n    end\n  },\n  {\n    -- Nested mappings are allowed and can be added in any order\n    -- Most attributes can be inherited or overridden on any level\n    -- There's no limit to the depth of nesting\n    mode = { \"n\", \"v\" }, -- NORMAL and VISUAL mode\n    { \"\u003Cleader>q\", \"\u003Ccmd>q\u003Ccr>\", desc = \"Quit\" }, -- no need to specify mode since it's inherited\n    { \"\u003Cleader>w\", \"\u003Ccmd>w\u003Ccr>\", desc = \"Write\" },\n  }\n})\n```\n\n## 🎯 Triggers\n\nThere's two ways that **which-key** can be triggered:\n\n- by a trigger keymap\n- by a `ModeChanged` event for visual and operator pending mode\n\nBoth can be configured using `opts.triggers` and `opts.defer`.\n\nBy default `opts.triggers` includes `{ \"\u003Cauto>\", mode = \"nixsotc\" }`, which\nwill setup keymap triggers for every mode automatically and will trigger during\n`ModeChanged`.\n\n> [!NOTE]\n> Auto triggers will never be created for existing keymaps.\n> That includes every valid single key Neovim builtin mapping.\n> If you want to trigger on a builtin keymap, you have to add it manually.\n>\n> ```lua\n>  triggers = {\n>    { \"\u003Cauto>\", mode = \"nixsotc\" },\n>    { \"a\", mode = { \"n\", \"v\" } },\n>  }\n> ```\n\n> [!TIP]\n> To manually setup triggers, you can set `opts.triggers` to:\n>\n> ```lua\n>  triggers = {\n>    { \"\u003Cleader>\", mode = { \"n\", \"v\" } },\n>  }\n> ```\n\nFor `ModeChanged` triggers, you can configure the `opts.defer` option.\nWhen it returns `true`, the popup will be shown only after an additional key is pressed.\nSo `yaf`, would show which-key after pressing `ya`, but not after `y`.\n\n> [!TIP]\n> Defer some operators:\n>\n> ```lua\n> ---@param ctx { mode: string, operator: string }\n> defer = function(ctx)\n>   if vim.list_contains({ \"d\", \"y\" }, ctx.operator) then\n>     return true\n>   end\n>   return vim.list_contains({ \"\u003CC-V>\", \"V\" }, ctx.mode)\n> end,\n> ```\n\n## 🎨 Icons\n\n> [!note]\n> For full support, you need to install either [mini.icons](https:\u002F\u002Fgithub.com\u002Fechasnovski\u002Fmini.icons) or [nvim-web-devicons](https:\u002F\u002Fgithub.com\u002Fnvim-tree\u002Fnvim-web-devicons)\n\nThere's multiple ways to set icons for your keymaps:\n\n- if you use lazy.nvim, then some icons will be autodetected for keymaps belonging to certain plugins.\n- custom rules to decide what icon to use\n- in your mapping spec, you can specify what icon to use at any level, so at the node for `\u003Cleader>g` for example, to apply to all git keymaps.\n\nThe `icon` attribute of a mapping can be a `string`, which will be used as the actual icon,\nor an `wk.Icon` object, which can have the following attributes:\n\n- `icon` (`string`): the icon to use **_(optional)_**\n- `hl` (`string`): the highlight group to use for the icon **_(optional)_**\n- `color` (`string`): the color to use for the icon **_(optional)_**\n  valid colors are: `azure`, `blue`, `cyan`, `green`, `grey`, `orange`, `purple`, `red`, `yellow`\n- `cat` (`string`): the category of the icon **_(optional)_**\n  valid categories are: `file`, `filetype`, `extension`\n- `name` (`string`): the name of the icon in the specified category **_(optional)_**\n\n> [!TIP]\n> If you'd rather not use icons, you can disable them\n> by setting `opts.icons.mappings` to `false`.\n\n## 🚀 Usage\n\nWhen the **WhichKey** popup is open, you can use the following key bindings (they are also displayed at the bottom of the screen):\n\n- hit one of the keys to open a group or execute a key binding\n- `\u003Cesc>` to cancel and close the popup\n- `\u003Cbs>` go up one level\n- `\u003Cc-d>` scroll down\n- `\u003Cc-u>` scroll up\n\n## 🐙 Hydra Mode\n\nHydra mode is a special mode that keeps the popup open until you hit `\u003Cesc>`.\n\n```lua\n-- Show hydra mode for changing windows\nrequire(\"which-key\").show({\n  keys = \"\u003Cc-w>\",\n  loop = true, -- this will keep the popup open until you hit \u003Cesc>\n})\n```\n\n## 🔥 Plugins\n\nFour built-in plugins are included with **WhichKey**.\n\n### Presets\n\nBuilt-in key binding help for `motions`, `text-objects`, `operators`, `windows`, `nav`, `z` and `g` and more.\n\n### Marks\n\nShows a list of your buffer local and global marks when you hit \\` or '\n\n![image](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F43fb0874-7f79-4521-aee9-03e2b0841758)\n\n### Registers\n\nShows a list of your buffer local and global registers when you hit \" in _NORMAL_ mode, or `\u003Cc-r>` in _INSERT_ mode.\n\n![image](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fd8077dcb-56fb-47b0-ad9e-1aba5db16950)\n\n### Spelling\n\nWhen enabled, this plugin hooks into `z=` and replaces the full-screen spelling suggestions window by a list of suggestions within **WhichKey**.\n\n![image](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F102c7963-329a-40b9-b0a8-72c8656318b7)\n\n## 🎨 Colors\n\nThe table below shows all the highlight groups defined for **WhichKey** with their default link.\n\n\u003C!-- colors:start -->\n\n| Highlight Group | Default Group | Description |\n| --- | --- | --- |\n| **WhichKey** | ***Function*** |  |\n| **WhichKeyBorder** | ***FloatBorder*** | Border of the which-key window |\n| **WhichKeyDesc** | ***Identifier*** | description |\n| **WhichKeyGroup** | ***Keyword*** | group name |\n| **WhichKeyIcon** | ***@markup.link*** | icons |\n| **WhichKeyIconAzure** | ***Function*** |  |\n| **WhichKeyIconBlue** | ***DiagnosticInfo*** |  |\n| **WhichKeyIconCyan** | ***DiagnosticHint*** |  |\n| **WhichKeyIconGreen** | ***DiagnosticOk*** |  |\n| **WhichKeyIconGrey** | ***Normal*** |  |\n| **WhichKeyIconOrange** | ***DiagnosticWarn*** |  |\n| **WhichKeyIconPurple** | ***Constant*** |  |\n| **WhichKeyIconRed** | ***DiagnosticError*** |  |\n| **WhichKeyIconYellow** | ***DiagnosticWarn*** |  |\n| **WhichKeyNormal** | ***NormalFloat*** | Normal in th which-key window |\n| **WhichKeySeparator** | ***Comment*** | the separator between the key and its description |\n| **WhichKeyTitle** | ***FloatTitle*** | Title of the which-key window |\n| **WhichKeyValue** | ***Comment*** | values by plugins (like marks, registers, etc) |\n\n\u003C!-- colors:end -->\n","WhichKey.nvim 是一个帮助用户记忆 Neovim 键位映射的插件，它能在你输入时以弹出窗口的形式显示可用的键位绑定。其核心功能包括实时显示键位绑定、支持多种模式（如普通、插入、可视等）、提供自定义布局和灵活排序选项，同时兼容多种图标集以增强视觉效果。此外，该插件还具备延迟调整、内置插件支持以及对操作符、动作和文本对象的帮助等功能。适用于任何希望提高 Neovim 使用效率，特别是那些经常使用复杂键位组合的开发者或重度用户。",2,"2026-06-11 03:32:57","high_star"]