summaryrefslogtreecommitdiff
path: root/lua/telescope/actions/utils.lua
blob: 7c8a3ac4653e5308996ae6daf2e7a929db89cd2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
---@tag telescope.actions.utils

---@brief [[
--- Utilities to wrap functions around picker selections and entries.
---
--- Generally used from within other |telescope.actions|
---@brief ]]

local action_state = require "telescope.actions.state"

local utils = {}

--- Apply `f` to the entries of the current picker.
--- - Notes:
---   - Mapped entries may include results not visible in the results popup.
---   - Indices are 1-indexed, whereas rows are 0-indexed.
--- - Warning: `map_entries` has no return value.
---   - The below example showcases how to collect results
--- <pre>
--- Usage:
---     local action_state = require "telescope.actions.state"
---     local action_utils = require "telescope.actions.utils"
---     function entry_value_by_row()
---       local prompt_bufnr = vim.api.nvim_get_current_buf()
---       local current_picker = action_state.get_current_picker(prompt_bufnr)
---       local results = {}
---         action_utils.map_entries(prompt_bufnr, function(entry, index, row)
---         results[row] = entry.value
---       end)
---       return results
---     end
--- </pre>
---@param prompt_bufnr number: The prompt bufnr
---@param f function: Function to map onto entries of picker that takes (entry, index, row) as viable arguments
function utils.map_entries(prompt_bufnr, f)
  vim.validate {
    f = { f, "function" },
  }
  local current_picker = action_state.get_current_picker(prompt_bufnr)
  local index = 1
  -- indices are 1-indexed, rows are 0-indexed
  for entry in current_picker.manager:iter() do
    local row = current_picker:get_row(index)
    f(entry, index, row)
    index = index + 1
  end
end

--- Apply `f` to the multi selections of the current picker and return a table of mapped selections.
--- - Notes:
---   - Mapped selections may include results not visible in the results popup.
---   - Selected entries are returned in order of their selection.
--- - Warning: `map_selections` has no return value.
---   - The below example showcases how to collect results
--- <pre>
--- Usage:
---     local action_state = require "telescope.actions.state"
---     local action_utils = require "telescope.actions.utils"
---     function selection_by_index()
---       local prompt_bufnr = vim.api.nvim_get_current_buf()
---       local current_picker = action_state.get_current_picker(prompt_bufnr)
---       local results = {}
---         action_utils.map_selections(prompt_bufnr, function(entry, index)
---         results[index] = entry.value
---       end)
---       return results
---     end
--- </pre>
---@param prompt_bufnr number: The prompt bufnr
---@param f function: Function to map onto selection of picker that takes (selection) as a viable argument
function utils.map_selections(prompt_bufnr, f)
  vim.validate {
    f = { f, "function" },
  }
  local current_picker = action_state.get_current_picker(prompt_bufnr)
  for _, selection in ipairs(current_picker:get_multi_selection()) do
    f(selection)
  end
end

local findnth = function(str, nth)
  local array = {}
  for i in string.gmatch(str, "%d+") do
    table.insert(array, tonumber(i))
  end
  return array[nth]
end

--- Utility to collect mappings of prompt buffer in array of `{mode, keybind, name}`.
---@param prompt_bufnr number: The prompt bufnr
function utils.get_registered_mappings(prompt_bufnr)
  local ret = {}
  for _, mode in ipairs { "n", "i" } do
    local mode_mappings = vim.api.nvim_buf_get_keymap(prompt_bufnr, mode)
    for _, mapping in ipairs(mode_mappings) do
      local funcid = findnth(mapping.rhs, 2)
      table.insert(ret, { mode = mode, keybind = mapping.lhs, func = __TelescopeKeymapStore[prompt_bufnr][funcid] })
    end
  end
  return ret
end

return utils