feat: Add mapping to delete avante history via telescope.nvim (#2867)

This commit is contained in:
XuJiawei
2025-12-14 02:49:54 +08:00
committed by GitHub
parent 0336666a73
commit 08977a401f
4 changed files with 53 additions and 13 deletions

View File

@@ -69,13 +69,8 @@ function M.open(bufnr, cb)
return return
end end
Path.history.delete(bufnr, item_id_to_delete) -- bufnr from M.open's scope Path.history.delete(bufnr, item_id_to_delete) -- bufnr from M.open's scope
-- The native provider handles the UI flow; we just need to refresh.
M.open(bufnr, cb) -- Re-open the selector to refresh the list
end,
on_action_cancel = function()
-- If the user cancels the open/delete prompt, re-open the history selector.
M.open(bufnr, cb)
end, end,
on_open = function() M.open(bufnr, cb) end,
}) })
current_selector:open() current_selector:open()
end end

View File

@@ -14,7 +14,7 @@ local Utils = require("avante.utils")
---@field on_select fun(item_ids: string[] | nil) ---@field on_select fun(item_ids: string[] | nil)
---@field get_preview_content fun(item_id: string): (string, string) | nil ---@field get_preview_content fun(item_id: string): (string, string) | nil
---@field on_delete_item fun(item_id: string): (nil) | nil ---@field on_delete_item fun(item_id: string): (nil) | nil
---@field on_action_cancel fun(): (nil) | nil ---@field on_open fun(): (nil) | nil
---@class avante.ui.Selector ---@class avante.ui.Selector
---@field provider avante.SelectorProvider ---@field provider avante.SelectorProvider
@@ -26,7 +26,7 @@ local Utils = require("avante.utils")
---@field selected_item_ids string[] | nil ---@field selected_item_ids string[] | nil
---@field get_preview_content fun(item_id: string): (string, string) | nil ---@field get_preview_content fun(item_id: string): (string, string) | nil
---@field on_delete_item fun(item_id: string): (nil) | nil ---@field on_delete_item fun(item_id: string): (nil) | nil
---@field on_action_cancel fun(): (nil) | nil ---@field on_open fun(): (nil) | nil
local Selector = {} local Selector = {}
Selector.__index = Selector Selector.__index = Selector
@@ -50,7 +50,7 @@ function Selector:new(opts)
o.selected_item_ids = opts.selected_item_ids or {} o.selected_item_ids = opts.selected_item_ids or {}
o.get_preview_content = opts.get_preview_content o.get_preview_content = opts.get_preview_content
o.on_delete_item = opts.on_delete_item o.on_delete_item = opts.on_delete_item
o.on_action_cancel = opts.on_action_cancel o.on_open = opts.on_open
return o return o
end end

View File

@@ -27,16 +27,18 @@ function M.show(selector)
local choice = input:lower() local choice = input:lower()
if choice == "d" or choice == "delete" then if choice == "d" or choice == "delete" then
selector.on_delete_item(item.id) selector.on_delete_item(item.id)
-- The native provider handles the UI flow; we just need to refresh.
selector.on_open() -- Re-open the selector to refresh the list
elseif choice == "" or choice == "o" or choice == "open" then elseif choice == "" or choice == "o" or choice == "open" then
selector.on_select({ item.id }) selector.on_select({ item.id })
elseif choice == "c" or choice == "cancel" then elseif choice == "c" or choice == "cancel" then
if type(selector.on_action_cancel) == "function" then if type(selector.on_open) == "function" then
selector.on_action_cancel() selector.on_open()
else else
selector.on_select(nil) -- Fallback if on_action_cancel is not defined selector.on_select(nil) -- Fallback if on_open is not defined
end end
else -- c or any other input, treat as cancel else -- c or any other input, treat as cancel
selector.on_select(nil) -- Fallback if on_action_cancel is not defined selector.on_select(nil) -- Fallback if on_open is not defined
end end
end end
) )

View File

@@ -61,6 +61,49 @@ function M.show(selector)
}), }),
attach_mappings = function(prompt_bufnr, map) attach_mappings = function(prompt_bufnr, map)
map("i", "<esc>", require("telescope.actions").close) map("i", "<esc>", require("telescope.actions").close)
map("i", "<c-del>", function()
local picker = action_state.get_current_picker(prompt_bufnr)
local selections
local multi_selection = picker:get_multi_selection()
if #multi_selection ~= 0 then
selections = multi_selection
else
selections = action_state.get_selected_entry()
selections = vim.islist(selections) and selections or { selections }
end
local selected_item_ids = vim
.iter(selections)
:map(function(selection) return selection.value end)
:totable()
vim.ui.input({ prompt = "Remove·selection?·(" .. #selected_item_ids .. " items) [y/N]" }, function(input)
if input and input:lower() == "y" then
for _, item_id in ipairs(selected_item_ids) do
selector.on_delete_item(item_id)
end
local new_items = {}
for _, item in ipairs(items) do
if not vim.list_contains(selected_item_ids, item.id) then table.insert(new_items, item) end
end
local new_finder = finders.new_table({
results = new_items,
entry_maker = function(entry)
return {
value = entry.id,
display = entry.title,
ordinal = entry.title,
}
end,
})
picker:refresh(new_finder, { reset_prompt = true })
end
end)
end, { desc = "delete_selection" })
actions.select_default:replace(function() actions.select_default:replace(function()
local picker = action_state.get_current_picker(prompt_bufnr) local picker = action_state.get_current_picker(prompt_bufnr)