diff --git a/lua/telescope/actions/generate.lua b/lua/telescope/actions/generate.lua index 2069b03b3d..703c83d538 100644 --- a/lua/telescope/actions/generate.lua +++ b/lua/telescope/actions/generate.lua @@ -24,6 +24,10 @@ ---@brief ]] local actions = require "telescope.actions" +local config = require "telescope.config" +local action_state = require "telescope.actions.state" +local finders = require "telescope.finders" + local action_generate = {} --- Display the keymaps of registered actions similar to which-key.nvim.
@@ -54,4 +58,56 @@ action_generate.which_key = function(opts) end end +action_generate.refine = function(prompt_bufnr, opts) + opts = opts or {} + opts.prompt_to_prefix = vim.F.if_nil(opts.prompt_to_prefix, false) + opts.prefix_hl_group = vim.F.if_nil(opts.prompt_hl_group, "TelescopePromptPrefix") + opts.prompt_prefix = vim.F.if_nil(opts.promt_prefix, config.values.prompt_prefix) + opts.reset_multi_selection = vim.F.if_nil(opts.reset_multi_selection, false) + opts.reset_prompt = vim.F.if_nil(opts.reset_prompt, true) + opts.sorter = vim.F.if_nil(opts.sorter, config.values.generic_sorter {}) + + local current_picker = action_state.get_current_picker(prompt_bufnr) + + -- title + if opts.prompt_title then + current_picker.prompt_border:change_title(opts.prompt_title) + end + + if opts.results_title then + current_picker.results_border:change_title(opts.results_title) + end + + local results = {} + for entry in current_picker.manager:iter() do + table.insert(results, entry) + end + + -- if opts.sorter == false, keep older sorter + if opts.sorter then + current_picker.sorter:_destroy() + current_picker.sorter = opts.sorter + current_picker.sorter:_init() + end + + local new_finder = finders.new_table { + results = results, + entry_maker = function(x) + return x + end, + } + + if not opts.reset_multi_selection and action_state.get_current_line() ~= "" then + opts.multi = current_picker._multi + end + + if opts.prompt_to_prefix then + local prompt = action_state.get_current_line() + local current_prefix = current_picker.prompt_prefix + local suffix = current_prefix ~= opts.prompt_prefix and current_prefix or "" + opts.new_prefix = suffix .. prompt .. " " .. opts.prompt_prefix + end + current_picker:refresh(new_finder, opts) +end + return action_generate diff --git a/lua/telescope/builtin/files.lua b/lua/telescope/builtin/files.lua index 599dc55584..94639f642a 100644 --- a/lua/telescope/builtin/files.lua +++ b/lua/telescope/builtin/files.lua @@ -111,6 +111,16 @@ files.live_grep = function(opts) -- TODO: It would be cool to use `--json` output for this -- and then we could get the highlight positions directly. sorter = sorters.highlighter_only(opts), + attach_mappings = function(_, map) + map("i", "", function(prompt_bufnr) + local line = action_state.get_current_line() + require("telescope.actions.generate").refine(prompt_bufnr, { + prompt_title = "Find Word (" .. line .. ")", + sorter = conf.generic_sorter(opts), + }) + end) + return true + end, }):find() end diff --git a/lua/telescope/builtin/lsp.lua b/lua/telescope/builtin/lsp.lua index 85fabb060b..480d456924 100644 --- a/lua/telescope/builtin/lsp.lua +++ b/lua/telescope/builtin/lsp.lua @@ -1,5 +1,6 @@ local channel = require("plenary.async.control").channel - +local action_state = require "telescope.actions.state" +local sorters = require "telescope.sorters" local conf = require("telescope.config").values local finders = require "telescope.finders" local make_entry = require "telescope.make_entry" @@ -315,7 +316,17 @@ lsp.dynamic_workspace_symbols = function(opts) fn = get_workspace_symbols_requester(opts.bufnr, opts), }, previewer = conf.qflist_previewer(opts), - sorter = conf.generic_sorter(opts), + sorter = sorters.highlighter_only(opts), + attach_mappings = function(_, map) + map("i", "", function(prompt_bufnr) + local line = action_state.get_current_line() + require("telescope.actions.generate").refine(prompt_bufnr, { + prompt_title = "LSP Workspace Symbols (" .. line .. ")", + sorter = conf.generic_sorter(opts), + }) + end) + return true + end, }):find() end diff --git a/lua/telescope/finders/async_oneshot_finder.lua b/lua/telescope/finders/async_oneshot_finder.lua index c8c2957b43..e3bd0ad4d4 100644 --- a/lua/telescope/finders/async_oneshot_finder.lua +++ b/lua/telescope/finders/async_oneshot_finder.lua @@ -30,6 +30,7 @@ return function(opts) end end, results = results, + entry_maker = entry_maker, }, { __call = function(_, prompt, process_result, process_complete) if not job_started then diff --git a/lua/telescope/finders/async_static_finder.lua b/lua/telescope/finders/async_static_finder.lua index 941d858158..7a684f98f9 100644 --- a/lua/telescope/finders/async_static_finder.lua +++ b/lua/telescope/finders/async_static_finder.lua @@ -24,6 +24,7 @@ return function(opts) return setmetatable({ results = results, + entry_maker = entry_maker, close = function() end, }, { __call = function(_, _, process_result, process_complete) diff --git a/lua/telescope/pickers.lua b/lua/telescope/pickers.lua index 1a45cd4f87..82ccda9c36 100644 --- a/lua/telescope/pickers.lua +++ b/lua/telescope/pickers.lua @@ -911,7 +911,7 @@ function Picker:refresh(finder, opts) local handle = type(opts.new_prefix) == "table" and unpack or function(x) return x end - self:change_prompt_prefix(handle(opts.new_prefix)) + self:change_prompt_prefix(handle(opts.new_prefix), opts.prefix_hl_group) end if finder then