feat(picker.keymaps): improvements to keymaps picker

This commit is contained in:
Folke Lemaitre 2025-01-23 09:14:29 +01:00
parent bc47e0b1dd
commit 2762c37eb0
No known key found for this signature in database
GPG key ID: 41F8B1FBACAE2040
5 changed files with 29 additions and 2 deletions

View file

@ -270,6 +270,9 @@ local defaults = {
files = {
enabled = true, -- show file icons
},
keymaps = {
nowait = "󰓅 "
},
indent = {
vertical = "",
middle = "├╴",

View file

@ -39,6 +39,7 @@ Snacks.util.set_hl({
Register = "Number",
KeymapMode = "Number",
KeymapLhs = "Special",
KeymapNowait = "@variable.builtin",
BufNr = "Number",
BufFlags = "NonText",
KeymapRhs = "NonText",

View file

@ -280,12 +280,14 @@ M.jumps = {
---@class snacks.picker.keymaps.Config: snacks.picker.Config
---@field global? boolean show global keymaps
---@field local? boolean show buffer keymaps
---@field plugs? boolean show plugin keymaps
---@field modes? string[]
M.keymaps = {
finder = "vim_keymaps",
format = "keymap",
preview = "preview",
global = true,
plugs = false,
["local"] = true,
modes = { "n", "v", "x", "s", "o", "i", "c", "t" },
confirm = function(picker, item)

View file

@ -373,11 +373,27 @@ function M.keymap(item, picker)
ret[#ret + 1] = { " " }
end
end
local lhs = vim.fn.keytrans(Snacks.util.keycode(k.lhs))
local lhs = Snacks.util.normkey(k.lhs)
ret[#ret + 1] = { k.mode, "SnacksPickerKeymapMode" }
ret[#ret + 1] = { " " }
ret[#ret + 1] = { a(lhs, 15), "SnacksPickerKeymapLhs" }
ret[#ret + 1] = { " " }
local icon_nowait = picker.opts.icons.keymaps.nowait
if k.nowait == 1 then
ret[#ret + 1] = { icon_nowait, "SnacksPickerKeymapNowait" }
else
ret[#ret + 1] = { (" "):rep(vim.api.nvim_strwidth(icon_nowait)) }
end
ret[#ret + 1] = { " " }
if k.buffer and k.buffer > 0 then
ret[#ret + 1] = { a("buf:" .. k.buffer, 6), "SnacksPickerBufNr" }
else
ret[#ret + 1] = { a("", 6) }
end
ret[#ret + 1] = { " " }
local rhs_len = 0
if k.rhs and k.rhs ~= "" then
local rhs = k.rhs or ""

View file

@ -237,11 +237,16 @@ function M.keymaps(opts)
local done = {} ---@type table<string, boolean>
for _, km in ipairs(maps) do
local key = Snacks.picker.util.text(km, { "mode", "lhs", "buffer" })
if not done[key] then
local keep = true
if opts.plugs == false and km.lhs:match("^<Plug>") then
keep = false
end
if keep and not done[key] then
done[key] = true
local item = {
mode = km.mode,
item = km,
key = km.lhs,
preview = {
text = vim.inspect(km),
ft = "lua",