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.
This commit is contained in:
committed by
GitHub
parent
dc7f25c810
commit
74be3c3bba
@@ -1158,12 +1158,25 @@ end
|
|||||||
--- This action is not mapped by default and only intended for |builtin.pickers|.
|
--- This action is not mapped by default and only intended for |builtin.pickers|.
|
||||||
---@param prompt_bufnr number: The prompt bufnr
|
---@param prompt_bufnr number: The prompt bufnr
|
||||||
actions.remove_selected_picker = function(prompt_bufnr)
|
actions.remove_selected_picker = function(prompt_bufnr)
|
||||||
local current_picker = action_state.get_current_picker(prompt_bufnr)
|
local curr_picker = action_state.get_current_picker(prompt_bufnr)
|
||||||
local selection_index = current_picker:get_index(current_picker:get_selection_row())
|
local curr_entry = action_state.get_selected_entry()
|
||||||
local cached_pickers = state.get_global_key "cached_pickers"
|
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)
|
table.remove(cached_pickers, selection_index)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
if #cached_pickers == 0 then
|
if #cached_pickers == 0 then
|
||||||
actions.close(prompt_bufnr)
|
actions.close(prompt_bufnr)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -194,9 +194,21 @@ internal.pickers = function(opts)
|
|||||||
cache_picker = false,
|
cache_picker = false,
|
||||||
attach_mappings = function(_, map)
|
attach_mappings = function(_, map)
|
||||||
actions.select_default:replace(function(prompt_bufnr)
|
actions.select_default:replace(function(prompt_bufnr)
|
||||||
local current_picker = action_state.get_current_picker(prompt_bufnr)
|
local curr_picker = action_state.get_current_picker(prompt_bufnr)
|
||||||
local selection_index = current_picker:get_index(current_picker:get_selection_row())
|
local curr_entry = action_state.get_selected_entry()
|
||||||
|
if not curr_entry then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
actions.close(prompt_bufnr)
|
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_picker = opts._cache_picker
|
||||||
opts["cache_index"] = selection_index
|
opts["cache_index"] = selection_index
|
||||||
opts["initial_mode"] = cached_pickers[selection_index].initial_mode
|
opts["initial_mode"] = cached_pickers[selection_index].initial_mode
|
||||||
|
|||||||
@@ -559,4 +559,12 @@ utils.__git_command = function(args, opts)
|
|||||||
return vim.list_extend(_args, args)
|
return vim.list_extend(_args, args)
|
||||||
end
|
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
|
return utils
|
||||||
|
|||||||
Reference in New Issue
Block a user