feat: show assigned function in actions.which_key (#1871)
This commit is contained in:
@@ -1128,6 +1128,16 @@ actions.which_key = function(prompt_bufnr, opts)
|
||||
table.insert(mappings, { mode = v.mode, keybind = v.keybind, name = name })
|
||||
end
|
||||
end
|
||||
elseif type(v.func) == "function" then
|
||||
if not opts.only_show_current_mode or mode == v.mode then
|
||||
local fname = action_utils._get_anon_function_name(v.func)
|
||||
table.insert(mappings, { mode = v.mode, keybind = v.keybind, name = fname })
|
||||
utils.notify("actions.which_key", {
|
||||
msg = "No name available for anonymous functions.",
|
||||
level = "INFO",
|
||||
once = true,
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -103,4 +103,36 @@ function utils.get_registered_mappings(prompt_bufnr)
|
||||
return ret
|
||||
end
|
||||
|
||||
-- Best effort to infer function names for actions.which_key
|
||||
function utils._get_anon_function_name(func_ref)
|
||||
local Path = require "plenary.path"
|
||||
local info = debug.getinfo(func_ref)
|
||||
local fname
|
||||
for i, line in ipairs(Path:new(info.short_src):readlines()) do
|
||||
if i == info.linedefined then
|
||||
fname = line
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
-- test if assignment or named function, otherwise anon
|
||||
if (fname:match "=" == nil) and (fname:match "function %S+%(" == nil) then
|
||||
return "<anonymous>"
|
||||
else
|
||||
-- (1) remove function
|
||||
-- (2) whitespace and equal
|
||||
-- (3) anything in parenthesis incl. parentheses themselves
|
||||
-- (4) remove TABLE. prefix if available
|
||||
local patterns = { { "function", "" }, { "local", "" }, { "[%s=]", "" }, { "%((.+)%)", "" }, { "(.+)%.", "" } }
|
||||
for _, tbl in ipairs(patterns) do
|
||||
fname = (fname:gsub(tbl[1], tbl[2])) -- make sure only string is returned
|
||||
end
|
||||
-- not sure if this can happen, catch all just in case
|
||||
if fname == nil or fname == "" then
|
||||
return "<anonymous>"
|
||||
end
|
||||
return fname
|
||||
end
|
||||
end
|
||||
|
||||
return utils
|
||||
|
||||
Reference in New Issue
Block a user