-- function to get paths of selected elements or current directory -- of no elements are selected local get_paths = ya.sync(function() local paths = {} -- get selected files for _, u in pairs(cx.active.selected) do paths[#paths + 1] = tostring(u) end -- if no files are selected, get current directory if #paths == 0 then if cx.active.current.cwd then paths[1] = tostring(cx.active.current.cwd) else ya.err("what-size would return nil paths") end end return paths end) -- Function to get total size from du output local get_total_size = function(s) local lines = {} for line in s:gmatch("[^\n]+") do lines[#lines + 1] = line end local last_line = lines[#lines] local last_line_parts = {} for part in last_line:gmatch("%S+") do last_line_parts[#last_line_parts + 1] = part end local total_size = last_line_parts[1] return total_size end -- Function to format file size local function format_size(size) local units = { "B", "KB", "MB", "GB", "TB" } local unit_index = 1 while size > 1024 and unit_index < #units do size = size / 1024 unit_index = unit_index + 1 end return string.format("%.2f %s", size, units[unit_index]) end return { entry = function(self, job) -- defaults not to use clipboard, use it only if required by the user local clipboard = job.args.clipboard or job.args[1] == '-c' local items = get_paths() local cmd = "du" local output, err = Command(cmd):arg("-scb"):args(items):output() if not output then ya.err("Failed to run diff, error: " .. err) else local total_size = get_total_size(output.stdout) local formatted_size = format_size(tonumber(total_size)) local notification_content = "Total size: " .. formatted_size if clipboard then ya.clipboard(formatted_size) notification_content = notification_content .. "\nCopied to clipboard." end ya.notify { title = "What size", content = notification_content, timeout = 5, } end end, }