diff --git a/lua/telescope/builtin/git.lua b/lua/telescope/builtin/git.lua index 71203bb..7db45ef 100644 --- a/lua/telescope/builtin/git.lua +++ b/lua/telescope/builtin/git.lua @@ -281,7 +281,7 @@ git.branches = function(opts) entry.value = entry.name entry.ordinal = entry.name entry.display = make_display - return entry + return make_entry.set_default_entry_mt(entry, opts) end, }, previewer = previewers.git_branch_log.new(opts), diff --git a/lua/telescope/builtin/internal.lua b/lua/telescope/builtin/internal.lua index 8d644fb..2cae23f 100644 --- a/lua/telescope/builtin/internal.lua +++ b/lua/telescope/builtin/internal.lua @@ -70,13 +70,13 @@ internal.builtin = function(opts) finder = finders.new_table { results = objs, entry_maker = function(entry) - return { + return make_entry.set_default_entry_mt({ value = entry, text = entry.text, display = entry.text, ordinal = entry.text, filename = entry.filename, - } + }, opts) end, }, previewer = previewers.builtin.new(opts), @@ -221,11 +221,11 @@ internal.planets = function(opts) finder = finders.new_table { results = acceptable_files, entry_maker = function(line) - return { + return make_entry.set_default_entry_mt({ ordinal = line, display = line, filename = base_directory .. "/data/memes/planets/" .. line, - } + }, opts) end, }, previewer = previewers.cat.new(opts), @@ -298,11 +298,11 @@ internal.symbols = function(opts) finder = finders.new_table { results = results, entry_maker = function(entry) - return { + return make_entry.set_default_entry_mt({ value = entry, ordinal = entry[1] .. " " .. entry[2], display = entry[1] .. " " .. entry[2], - } + }, opts) end, }, sorter = conf.generic_sorter(opts), @@ -399,14 +399,14 @@ internal.quickfixhistory = function(opts) end local entry_maker = opts.make_entry or function(entry) - return { + return make_entry.set_default_entry_mt({ value = entry.title or "Untitled", ordinal = entry.title or "Untitled", display = entry.title or "Untitled", nr = entry.nr, id = entry.id, items = entry.items, - } + }, opts) end local qf_entry_maker = make_entry.gen_from_quickfix(opts) pickers.new(opts, { @@ -690,13 +690,13 @@ internal.help_tags = function(opts) finder = finders.new_table { results = tags, entry_maker = function(entry) - return { + return make_entry.set_default_entry_mt({ value = entry.name .. "@" .. entry.lang, display = entry.name, ordinal = entry.name, filename = entry.filename, cmd = entry.cmd, - } + }, opts) end, }, previewer = previewers.help.new(opts), @@ -1189,10 +1189,8 @@ internal.autocommands = function(opts) return false end local val = selection.value - local output = vim.fn.execute( - "verb autocmd " .. val.group_name .. " " .. val.event .. " " .. val.pattern, - "silent" - ) + local group_name = val.group_name ~= "" or "" + local output = vim.fn.execute("verb autocmd " .. group_name .. " " .. val.event .. " " .. val.pattern, "silent") for line in output:gmatch "[^\r\n]+" do local source_file = line:match "Last set from (.*) line %d*$" or line:match "Last set from (.*)$" if source_file and source_file ~= "Lua" then diff --git a/lua/telescope/make_entry.lua b/lua/telescope/make_entry.lua index 8e9f84a..e8f2509 100644 --- a/lua/telescope/make_entry.lua +++ b/lua/telescope/make_entry.lua @@ -41,8 +41,40 @@ local get_filename_fn = function() end end +local handle_entry_index = function(opts, t, k) + local override = ((opts or {}).entry_index or {})[k] + if not override then + return + end + + local val, save = override(t, opts) + if save then + rawset(t, k, val) + end + return val +end + local make_entry = {} +make_entry.set_default_entry_mt = function(tbl, opts) + return setmetatable({}, { + __index = function(t, k) + local override = handle_entry_index(opts, t, k) + if override then + return override + end + + -- Only hit tbl once + local val = tbl[k] + if val then + rawset(t, k, val) + end + + return val + end, + }) +end + do local lookup_keys = { display = 1, @@ -50,13 +82,18 @@ do value = 1, } - local mt_string_entry = { - __index = function(t, k) - return rawget(t, rawget(lookup_keys, k)) - end, - } + function make_entry.gen_from_string(opts) + local mt_string_entry = { + __index = function(t, k) + local override = handle_entry_index(opts, t, k) + if override then + return override + end + + return rawget(t, rawget(lookup_keys, k)) + end, + } - function make_entry.gen_from_string() return function(line) return setmetatable({ line, @@ -97,6 +134,11 @@ do end mt_file_entry.__index = function(t, k) + local override = handle_entry_index(opts, t, k) + if override then + return override + end + local raw = rawget(mt_file_entry, k) if raw then return raw @@ -220,6 +262,11 @@ do end, __index = function(t, k) + local override = handle_entry_index(opts, t, k) + if override then + return override + end + local raw = rawget(mt_vimgrep_entry, k) if raw then return raw @@ -272,13 +319,13 @@ function make_entry.gen_from_git_stash(opts) local _, branch_name = string.match(splitted[2], "^([WIP on|On]+) (.+)") local commit_info = splitted[3] - return { + return make_entry.set_default_entry_mt({ value = stash_idx, ordinal = commit_info, branch_name = branch_name, commit_info = commit_info, display = make_display, - } + }, opts) end end @@ -312,13 +359,13 @@ function make_entry.gen_from_git_commits(opts) msg = "" end - return { + return make_entry.set_default_entry_mt({ value = sha, ordinal = sha .. " " .. msg, msg = msg, display = make_display, current_file = opts.current_file, - } + }, opts) end end @@ -364,7 +411,7 @@ function make_entry.gen_from_quickfix(opts) return function(entry) local filename = vim.F.if_nil(entry.filename, get_filename(entry.bufnr)) - return { + return make_entry.set_default_entry_mt({ value = entry, ordinal = (not hidden and filename or "") .. " " .. entry.text, display = make_display, @@ -376,7 +423,7 @@ function make_entry.gen_from_quickfix(opts) text = entry.text, start = entry.start, finish = entry.finish, - } + }, opts) end end @@ -443,8 +490,7 @@ function make_entry.gen_from_lsp_symbols(opts) ordinal = filename .. " " end ordinal = ordinal .. symbol_name .. " " .. (symbol_type or "unknown") - - return { + return make_entry.set_default_entry_mt({ value = entry, ordinal = ordinal, display = make_display, @@ -456,7 +502,7 @@ function make_entry.gen_from_lsp_symbols(opts) symbol_type = symbol_type, start = entry.start, finish = entry.finish, - } + }, opts) end end @@ -508,7 +554,7 @@ function make_entry.gen_from_buffer(opts) local indicator = entry.flag .. hidden .. readonly .. changed local line_count = vim.api.nvim_buf_line_count(entry.bufnr) - return { + return make_entry.set_default_entry_mt({ value = bufname, ordinal = entry.bufnr .. " : " .. bufname, display = make_display, @@ -518,7 +564,7 @@ function make_entry.gen_from_buffer(opts) -- account for potentially stale lnum as getbufinfo might not be updated or from resuming buffers picker lnum = entry.info.lnum ~= 0 and math.max(math.min(entry.info.lnum, line_count), 1) or 1, indicator = indicator, - } + }, opts) end end @@ -565,7 +611,7 @@ function make_entry.gen_from_treesitter(opts) local ts_utils = require "nvim-treesitter.ts_utils" local start_row, start_col, end_row, _ = ts_utils.get_node_range(entry.node) local node_text = vim.treesitter.get_node_text(entry.node, bufnr) - return { + return make_entry.set_default_entry_mt({ value = entry.node, kind = entry.kind, ordinal = node_text .. " " .. (entry.kind or "unknown"), @@ -580,7 +626,7 @@ function make_entry.gen_from_treesitter(opts) text = node_text, start = start_row, finish = end_row, - } + }, opts) end end @@ -595,14 +641,12 @@ function make_entry.gen_from_packages(opts) end return function(module_name) - local entry = { + return make_entry.set_default_entry_mt({ valid = module_name ~= "", value = module_name, ordinal = module_name, - } - entry.display = make_display(module_name) - - return entry + display = make_display(module_name), + }, opts) end end @@ -644,21 +688,21 @@ function make_entry.gen_from_apropos(opts) cmd = vim.split(cmd, ",")[1] return keyword and sections[section] - and { + and make_entry.set_default_entry_mt({ value = cmd, description = desc, ordinal = cmd, display = make_display, section = section, keyword = keyword, - } + }, opts) or nil end end -function make_entry.gen_from_marks(_) +function make_entry.gen_from_marks(opts) return function(item) - return { + return make_entry.set_default_entry_mt({ value = item.line, ordinal = item.line, display = item.line, @@ -666,11 +710,11 @@ function make_entry.gen_from_marks(_) col = item.col, start = item.lnum, filename = item.filename, - } + }, opts) end end -function make_entry.gen_from_registers(_) +function make_entry.gen_from_registers(opts) local displayer = entry_display.create { separator = " ", hl_chars = { ["["] = "TelescopeBorder", ["]"] = "TelescopeBorder" }, @@ -689,12 +733,12 @@ function make_entry.gen_from_registers(_) end return function(entry) - return { + return make_entry.set_default_entry_mt({ value = entry, ordinal = entry, content = vim.fn.getreg(entry), display = make_display, - } + }, opts) end end @@ -727,7 +771,7 @@ function make_entry.gen_from_keymaps(opts) end return function(entry) - return { + return make_entry.set_default_entry_mt({ mode = entry.mode, lhs = get_lhs(entry), desc = get_desc(entry), @@ -736,22 +780,22 @@ function make_entry.gen_from_keymaps(opts) value = entry, ordinal = entry.mode .. " " .. get_lhs(entry) .. " " .. get_desc(entry), display = make_display, - } + }, opts) end end -function make_entry.gen_from_highlights() +function make_entry.gen_from_highlights(opts) local make_display = function(entry) local display = entry.value return display, { { { 0, #display }, display } } end return function(entry) - return { + return make_entry.set_default_entry_mt({ value = entry, display = make_display, ordinal = entry, - } + }, opts) end end @@ -772,12 +816,12 @@ function make_entry.gen_from_picker(opts) end return function(entry) - return { + return make_entry.set_default_entry_mt({ value = entry, text = entry.prompt_title, ordinal = string.format("%s %s", entry.prompt_title, vim.F.if_nil(entry.default_text, "")), display = make_display, - } + }, opts) end end @@ -820,17 +864,17 @@ function make_entry.gen_from_buffer_lines(opts) return end - return { + return make_entry.set_default_entry_mt({ ordinal = entry.text, display = make_display, filename = entry.filename, lnum = entry.lnum, text = entry.text, - } + }, opts) end end -function make_entry.gen_from_vimoptions() +function make_entry.gen_from_vimoptions(opts) local displayer = entry_display.create { separator = "", hl_chars = { ["["] = "TelescopeBorder", ["]"] = "TelescopeBorder" }, @@ -871,7 +915,7 @@ function make_entry.gen_from_vimoptions() entry.ordinal = entry.ordinal .. " " .. utils.display_termcodes(tostring(o.default)) end - return entry + return make_entry.set_default_entry_mt(entry, opts) end end @@ -927,6 +971,11 @@ function make_entry.gen_from_ctags(opts) local mt = {} mt.__index = function(t, k) + local override = handle_entry_index(opts, t, k) + if override then + return override + end + if k == "path" then local retpath = Path:new({ t.filename }):absolute() if not vim.loop.fs_access(retpath, "R", nil) then @@ -1036,7 +1085,7 @@ function make_entry.gen_from_diagnostics(opts) end return function(entry) - return { + return make_entry.set_default_entry_mt({ value = entry, ordinal = ("%s %s"):format(not hidden and entry.filename or "", entry.text), display = make_display, @@ -1045,11 +1094,11 @@ function make_entry.gen_from_diagnostics(opts) lnum = entry.lnum, col = entry.col, text = entry.text, - } + }, opts) end end -function make_entry.gen_from_autocommands(_) +function make_entry.gen_from_autocommands(opts) local displayer = entry_display.create { separator = "▏", items = { @@ -1071,7 +1120,7 @@ function make_entry.gen_from_autocommands(_) return function(entry) local group_name = vim.F.if_nil(entry.group_name, "") - return { + return make_entry.set_default_entry_mt({ value = { event = entry.event, group_name = group_name, @@ -1081,11 +1130,11 @@ function make_entry.gen_from_autocommands(_) -- ordinal = entry.event .. " " .. group_name .. " " .. entry.pattern .. " " .. entry.command, display = make_display, - } + }, opts) end end -function make_entry.gen_from_commands(_) +function make_entry.gen_from_commands(opts) local displayer = entry_display.create { separator = "▏", items = { @@ -1118,7 +1167,7 @@ function make_entry.gen_from_commands(_) end return function(entry) - return { + return make_entry.set_default_entry_mt({ name = entry.name, bang = entry.bang, nargs = entry.nargs, @@ -1128,7 +1177,7 @@ function make_entry.gen_from_commands(_) value = entry, ordinal = entry.name, display = make_display, - } + }, opts) end end @@ -1187,13 +1236,13 @@ function make_entry.gen_from_git_status(opts) end local mod, file = string.match(entry, "(..).*%s[->%s]?(.+)") - return { + return setmetatable({ value = file, status = mod, ordinal = entry, display = make_display, path = Path:new({ opts.cwd, file }):absolute(), - } + }, opts) end end