92 lines
2.9 KiB
Lua
92 lines
2.9 KiB
Lua
local Utils = require("avante.utils")
|
|
local M = {}
|
|
|
|
---@param selector avante.ui.Selector
|
|
function M.show(selector)
|
|
---@diagnostic disable-next-line: undefined-field
|
|
if not _G.Snacks then
|
|
Utils.error("Snacks is not set up. Please install and set up Snacks to use it as a file selector.")
|
|
return
|
|
end
|
|
local function snacks_finder(opts, ctx)
|
|
local query = ctx.filter.search or ""
|
|
local items = {}
|
|
for i, item in ipairs(selector.items) do
|
|
if not vim.list_contains(selector.selected_item_ids, item.id) then
|
|
if query == "" or item.title:match(query:gsub("[%(%)%.%%%+%-%*%?%[%]%^%$]", "%%%1")) then
|
|
table.insert(items, {
|
|
formatted = item.title,
|
|
text = item.title,
|
|
item = item,
|
|
idx = i,
|
|
preview = selector.get_preview_content and (function()
|
|
local content, filetype = selector.get_preview_content(item.id)
|
|
return {
|
|
text = content,
|
|
ft = filetype,
|
|
}
|
|
end)() or nil,
|
|
})
|
|
end
|
|
end
|
|
end
|
|
return items
|
|
end
|
|
|
|
local completed = false
|
|
|
|
---@diagnostic disable-next-line: undefined-global
|
|
Snacks.picker.pick(vim.tbl_deep_extend("force", {
|
|
source = "select",
|
|
live = true,
|
|
finder = snacks_finder,
|
|
---@diagnostic disable-next-line: undefined-global
|
|
format = Snacks.picker.format.ui_select({ format_item = function(item, _) return item.title end }),
|
|
title = selector.title,
|
|
preview = selector.get_preview_content and "preview" or nil,
|
|
layout = {
|
|
preset = "default",
|
|
},
|
|
confirm = function(picker)
|
|
if completed then return end
|
|
completed = true
|
|
picker:close()
|
|
local items = picker:selected({ fallback = true })
|
|
local selected_item_ids = vim.tbl_map(function(item) return item.item.id end, items)
|
|
selector.on_select(selected_item_ids)
|
|
end,
|
|
on_close = function()
|
|
if completed then return end
|
|
completed = true
|
|
vim.schedule(function() selector.on_select(nil) end)
|
|
end,
|
|
actions = {
|
|
delete_selection = function(picker)
|
|
local selections = picker:selected({ fallback = true })
|
|
if #selections == 0 then return end
|
|
vim.ui.input({ prompt = "Remove·selection?·(" .. #selections .. " items) [y/N]" }, function(input)
|
|
if input and input:lower() == "y" then
|
|
for _, selection in ipairs(selections) do
|
|
selector.on_delete_item(selection.item.id)
|
|
for i, item in ipairs(selector.items) do
|
|
if item.id == selection.item.id then table.remove(selector.items, i) end
|
|
end
|
|
end
|
|
picker:refresh()
|
|
end
|
|
end)
|
|
end,
|
|
},
|
|
|
|
win = {
|
|
input = {
|
|
keys = {
|
|
["<C-DEL>"] = { "delete_selection", mode = { "i", "n" } },
|
|
},
|
|
},
|
|
},
|
|
}, selector.provider_opts))
|
|
end
|
|
|
|
return M
|