diff --git a/lua/telescope/actions/init.lua b/lua/telescope/actions/init.lua index 402c979..4c3b42a 100644 --- a/lua/telescope/actions/init.lua +++ b/lua/telescope/actions/init.lua @@ -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 diff --git a/lua/telescope/actions/utils.lua b/lua/telescope/actions/utils.lua index f69112d..202ee73 100644 --- a/lua/telescope/actions/utils.lua +++ b/lua/telescope/actions/utils.lua @@ -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 "" + 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 "" + end + return fname + end +end + return utils diff --git a/lua/telescope/utils.lua b/lua/telescope/utils.lua index d4922f2..46eee27 100644 --- a/lua/telescope/utils.lua +++ b/lua/telescope/utils.lua @@ -477,14 +477,15 @@ end) --- Telescope Wrapper around vim.notify ---@param funname string: name of the function that will be ----@param opts table: opts.level string, opts.msg string +---@param opts table: opts.level string, opts.msg string, opts.once bool utils.notify = function(funname, opts) + opts.once = vim.F.if_nil(opts.once, false) local level = vim.log.levels[opts.level] if not level then error("Invalid error level", 2) end - - vim.notify(string.format("[telescope.%s]: %s", funname, opts.msg), level, { + local notify_fn = opts.once and vim.notify_once or vim.notify + notify_fn(string.format("[telescope.%s]: %s", funname, opts.msg), level, { title = "telescope.nvim", }) end