snacks.nvim/lua/snacks/picker/source/system.lua
2025-02-05 07:44:26 +01:00

66 lines
1.8 KiB
Lua

local M = {}
---@param opts snacks.picker.proc.Config
---@type snacks.picker.finder
function M.cliphist(opts, ctx)
return require("snacks.picker.source.proc").proc({
opts,
{
cmd = "cliphist",
args = { "list" },
---@param item snacks.picker.finder.Item
transform = function(item)
local id, content = item.text:match("^(%d+)%s+(.+)$")
if id and content and not content:find("^%[%[%s+binary data") then
item.text = content
setmetatable(item, {
__index = function(_, k)
if k == "data" then
local data = vim.fn.system({ "cliphist", "decode", id })
rawset(item, "data", data)
if vim.v.shell_error ~= 0 then
error(data)
end
return data
elseif k == "preview" then
return {
text = item.data,
ft = "text",
}
end
end,
})
else
return false
end
end,
},
}, ctx)
end
---@param opts snacks.picker.proc.Config
---@type snacks.picker.finder
function M.man(opts, ctx)
return require("snacks.picker.source.proc").proc({
opts,
{
cmd = "man",
args = { "-k", "." },
---@param item snacks.picker.finder.Item
transform = function(item)
local page, section, desc = item.text:match("^(%S+)%s*%((%S-)%)%s+-%s+(.+)$")
if page and section and desc then
item.section = section
item.desc = desc
item.page = page
item.section = section
item.ref = ("%s(%s)"):format(item.page, item.section or 1)
else
return false
end
end,
},
}, ctx)
end
return M