mirror of
https://github.com/folke/snacks.nvim
synced 2025-07-08 05:35:12 +00:00
105 lines
2.8 KiB
Lua
105 lines
2.8 KiB
Lua
---@class snacks.picker
|
|
---@field actions snacks.picker.actions
|
|
---@field config snacks.picker.config
|
|
---@field format snacks.picker.formatters
|
|
---@field preview snacks.picker.previewers
|
|
---@field sort snacks.picker.sorters
|
|
---@field util snacks.picker.util
|
|
---@field current? snacks.Picker
|
|
---@field highlight snacks.picker.highlight
|
|
---@field resume fun(opts?: snacks.picker.Config):snacks.Picker
|
|
---@field sources snacks.picker.sources.Config
|
|
---@overload fun(opts: snacks.picker.Config): snacks.Picker
|
|
---@overload fun(source: string, opts: snacks.picker.Config): snacks.Picker
|
|
local M = setmetatable({}, {
|
|
__call = function(M, ...)
|
|
return M.pick(...)
|
|
end,
|
|
---@param M snacks.picker
|
|
__index = function(M, k)
|
|
if type(k) ~= "string" then
|
|
return
|
|
end
|
|
local mods = {
|
|
"actions",
|
|
"config",
|
|
"format",
|
|
"preview",
|
|
"util",
|
|
"sort",
|
|
highlight = "util.highlight",
|
|
sources = "config.sources",
|
|
}
|
|
for m, mod in pairs(mods) do
|
|
mod = mod == k and k or m == k and mod or nil
|
|
if mod then
|
|
---@diagnostic disable-next-line: no-unknown
|
|
M[k] = require("snacks.picker." .. mod)
|
|
return rawget(M, k)
|
|
end
|
|
end
|
|
return M.config.wrap(k, { check = true })
|
|
end,
|
|
})
|
|
|
|
---@type snacks.meta.Meta
|
|
M.meta = {
|
|
desc = "Picker for selecting items",
|
|
needs_setup = true,
|
|
merge = { config = "config.defaults", picker = "core.picker", "actions" },
|
|
}
|
|
|
|
-- create actual picker functions for autocomplete
|
|
vim.defer_fn(function()
|
|
M.config.setup()
|
|
end, 10)
|
|
|
|
--- Create a new picker
|
|
---@param source? string
|
|
---@param opts? snacks.picker.Config
|
|
---@overload fun(opts: snacks.picker.Config): snacks.Picker
|
|
function M.pick(source, opts)
|
|
if not opts and type(source) == "table" then
|
|
opts, source = source, nil
|
|
end
|
|
opts = opts or {}
|
|
opts.source = source or opts.source
|
|
-- Show pickers if no source, items or finder is provided
|
|
if not (opts.source or opts.items or opts.finder or opts.multi) then
|
|
opts.source = "pickers"
|
|
return M.pick(opts)
|
|
end
|
|
local current = opts.source and M.get({ source = opts.source })[1]
|
|
if current then
|
|
current:close()
|
|
return
|
|
end
|
|
return require("snacks.picker.core.picker").new(opts)
|
|
end
|
|
|
|
--- Implementation for `vim.ui.select`
|
|
---@type snacks.picker.ui_select
|
|
function M.select(...)
|
|
return require("snacks.picker.select").select(...)
|
|
end
|
|
|
|
---@private
|
|
function M.setup()
|
|
if M.config.get().ui_select then
|
|
vim.ui.select = M.select
|
|
end
|
|
end
|
|
|
|
---@private
|
|
function M.health()
|
|
require("snacks.picker.core._health").health()
|
|
end
|
|
|
|
--- Get active pickers, optionally filtered by source,
|
|
--- or the current tab
|
|
---@param opts? {source?: string, tab?: boolean} tab defaults to true
|
|
function M.get(opts)
|
|
return require("snacks.picker.core.picker").get(opts)
|
|
end
|
|
|
|
return M
|