summaryrefslogtreecommitdiff
path: root/lua/telescope/actions
diff options
context:
space:
mode:
authorfdschmidt93 <39233597+fdschmidt93@users.noreply.github.com>2022-04-22 23:40:39 +0200
committerGitHub <noreply@github.com>2022-04-22 23:40:39 +0200
commit8b02088743c07c2f82aec2772fbd2b3774195448 (patch)
treee06cdbbec119f3de0ddc028d2b2c2a73d500f167 /lua/telescope/actions
parentd743d70292956f55f4a71f291281287d206f29f2 (diff)
fix(which_key): get full path & handle table assignment of funcrefs (#1875)
Diffstat (limited to 'lua/telescope/actions')
-rw-r--r--lua/telescope/actions/init.lua14
-rw-r--r--lua/telescope/actions/utils.lua22
2 files changed, 25 insertions, 11 deletions
diff --git a/lua/telescope/actions/init.lua b/lua/telescope/actions/init.lua
index 03bd20c..be55390 100644
--- a/lua/telescope/actions/init.lua
+++ b/lua/telescope/actions/init.lua
@@ -1129,12 +1129,16 @@ actions.which_key = function(prompt_bufnr, opts)
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)
+ -- telescope.setup mappings might result in function names that reflect the keys
+ fname = fname:lower() == v.keybind:lower() and "<anonymous>" or fname
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,
- })
+ if fname == "<anonymous>" then
+ utils.notify("actions.which_key", {
+ msg = "No name available for anonymous functions.",
+ level = "INFO",
+ once = true,
+ })
+ end
end
end
end
diff --git a/lua/telescope/actions/utils.lua b/lua/telescope/actions/utils.lua
index 202ee73..9684414 100644
--- a/lua/telescope/actions/utils.lua
+++ b/lua/telescope/actions/utils.lua
@@ -108,7 +108,13 @@ 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 fn defined in string (ie loadstring) source is string
+ -- if fn defined in file, source is file name prefixed with a `@ยด
+ local path = Path:new((info.source:gsub("@", "")))
+ if not path:exists() then
+ return "<anonymous>"
+ end
+ for i, line in ipairs(path:readlines()) do
if i == info.linedefined then
fname = line
break
@@ -119,11 +125,15 @@ function utils._get_anon_function_name(func_ref)
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=]", "" }, { "%((.+)%)", "" }, { "(.+)%.", "" } }
+ local patterns = {
+ { "function", "" }, -- remove function
+ { "local", "" }, -- remove local
+ { "[%s=]", "" }, -- remove whitespace and =
+ { [=[%[["']]=], "" }, -- remove left-hand bracket of table assignment
+ { [=[["']%]]=], "" }, -- remove right-ahnd bracket of table assignment
+ { "%((.+)%)", "" }, -- remove function arguments
+ { "(.+)%.", "" }, -- remove TABLE. prefix if available
+ }
for _, tbl in ipairs(patterns) do
fname = (fname:gsub(tbl[1], tbl[2])) -- make sure only string is returned
end