local M = {} local function get_yanked_info() return ya.sync(function() local cwd = cx.active.current.cwd local cut = cx.yanked.is_cut local yanked = {} for _, f in pairs(cx.yanked) do yanked[#yanked + 1] = { url = f.url, name = tostring(f.url:name()) } end return cwd, cut, yanked end) end local function rename_default(name) local suffix = os.date("-%y%m%d") local stem = name:match("^(.+)%..-$") or name local ext = name:match("%.(.+)$") or "" if ext ~= "" then return stem .. suffix .. "." .. ext else return name .. suffix end end function M:entry(_, job) local cwd, cut, yanked = get_yanked_info() if #yanked == 0 then return end local follow = job.args.follow or false local resolved = {} -- Partition: check each yanked item for conflicts local conflicts = {} for _, item in ipairs(yanked) do local dest = cwd:join(item.name) local cha = fs.cha(dest) if cha ~= nil then conflicts[#conflicts + 1] = { url = item.url, dest = dest, name = item.name } else resolved[#resolved + 1] = { from = tostring(item.url), to = tostring(dest), overwrite = false, } end end -- Process conflicts local sync_all = false for _, item in ipairs(conflicts) do if sync_all then resolved[#resolved + 1] = { from = tostring(item.url), to = tostring(item.dest), overwrite = true, } else local choice = ya.pick({ title = "Paste conflict: " .. item.name, items = { "Sync (merge/overwrite)", "Sync all remaining", "Rename", "Skip", "Cancel", }, }) -- ya.pick returns 0-based index or nil if choice == nil or choice == 4 then -- Cancel: paste what we have so far, then abort if #resolved > 0 then ya.emit("paste_resolved", { cut = cut, follow = follow, items = resolved, }) end return elseif choice == 0 then -- Sync current resolved[#resolved + 1] = { from = tostring(item.url), to = tostring(item.dest), overwrite = true, } elseif choice == 1 then -- Sync all remaining sync_all = true resolved[#resolved + 1] = { from = tostring(item.url), to = tostring(item.dest), overwrite = true, } elseif choice == 2 then -- Rename local default = rename_default(item.name) local value, event = ya.input({ title = "New name", value = default, }) if event == 1 then local new_dest = cwd:join(value) resolved[#resolved + 1] = { from = tostring(item.url), to = tostring(new_dest), overwrite = false, } end elseif choice == 3 then -- Skip: do nothing end end end -- Dispatch all resolved items if #resolved > 0 then ya.emit("paste_resolved", { cut = cut, follow = follow, items = resolved, }) end end return M