fix(builtin.pickers): fix wrong picker resuming when using filtering (#2682)

When filtering is applied, `picker:get_index(picker:get_selection_row())` returns index relative to the filtered entry list rather than the original full results. This causes inaccurate indexing into the `cache_pickers` table.

(cherry picked from commit 74be3c3bba)
This commit is contained in:
Sofronie Cristian
2023-09-03 23:42:09 +03:00
committed by Simon Hauser
parent d3105f70dd
commit 0847120c40
3 changed files with 56 additions and 5 deletions
+16 -3
View File
@@ -1060,12 +1060,25 @@ end
--- This action is not mapped by default and only intended for |builtin.pickers|.
---@param prompt_bufnr number: The prompt bufnr
actions.remove_selected_picker = function(prompt_bufnr)
local current_picker = action_state.get_current_picker(prompt_bufnr)
local selection_index = current_picker:get_index(current_picker:get_selection_row())
local curr_picker = action_state.get_current_picker(prompt_bufnr)
local curr_entry = action_state.get_selected_entry()
local cached_pickers = state.get_global_key "cached_pickers"
current_picker:delete_selection(function()
if not curr_entry then
return
end
local selection_index, _ = utils.list_find(function(v)
if curr_entry.value == v.value then
return true
end
return false
end, curr_picker.finder.results)
curr_picker:delete_selection(function()
table.remove(cached_pickers, selection_index)
end)
if #cached_pickers == 0 then
actions.close(prompt_bufnr)
end
+14 -2
View File
@@ -194,9 +194,21 @@ internal.pickers = function(opts)
cache_picker = false,
attach_mappings = function(_, map)
actions.select_default:replace(function(prompt_bufnr)
local current_picker = action_state.get_current_picker(prompt_bufnr)
local selection_index = current_picker:get_index(current_picker:get_selection_row())
local curr_picker = action_state.get_current_picker(prompt_bufnr)
local curr_entry = action_state.get_selected_entry()
if not curr_entry then
return
end
actions.close(prompt_bufnr)
local selection_index, _ = utils.list_find(function(v)
if curr_entry.value == v.value then
return true
end
return false
end, curr_picker.finder.results)
opts.cache_picker = opts._cache_picker
opts["cache_index"] = selection_index
opts["initial_mode"] = cached_pickers[selection_index].initial_mode
+26
View File
@@ -555,4 +555,30 @@ utils.__warn_no_selection = function(name)
})
end
--- Generate git command optionally with git env variables
---@param args string[]
---@param opts? table
---@return string[]
utils.__git_command = function(args, opts)
opts = opts or {}
local _args = { "git" }
if opts.gitdir then
vim.list_extend(_args, { "--git-dir", opts.gitdir })
end
if opts.toplevel then
vim.list_extend(_args, { "--work-tree", opts.toplevel })
end
return vim.list_extend(_args, args)
end
utils.list_find = function(func, list)
for i, v in ipairs(list) do
if func(v, i, list) then
return i, v
end
end
end
return utils