summaryrefslogtreecommitdiff
path: root/fedora/.config/yazi/plugins/piper.yazi/main.lua
diff options
context:
space:
mode:
Diffstat (limited to 'fedora/.config/yazi/plugins/piper.yazi/main.lua')
-rw-r--r--fedora/.config/yazi/plugins/piper.yazi/main.lua70
1 files changed, 70 insertions, 0 deletions
diff --git a/fedora/.config/yazi/plugins/piper.yazi/main.lua b/fedora/.config/yazi/plugins/piper.yazi/main.lua
new file mode 100644
index 0000000..aef08eb
--- /dev/null
+++ b/fedora/.config/yazi/plugins/piper.yazi/main.lua
@@ -0,0 +1,70 @@
+--- @since 25.5.31
+
+local M = {}
+
+local function fail(job, s) ya.preview_widget(job, ui.Text.parse(s):area(job.area):wrap(ui.Wrap.YES)) end
+
+function M:peek(job)
+ local child, err = Command("sh")
+ :arg({ "-c", job.args[1], "sh", tostring(job.file.url) })
+ :env("w", job.area.w)
+ :env("h", job.area.h)
+ :stdout(Command.PIPED)
+ :stderr(Command.PIPED)
+ :spawn()
+
+ if not child then
+ return fail(job, "sh: " .. err)
+ end
+
+ local limit = job.area.h
+ local i, outs, errs = 0, {}, {}
+ repeat
+ local next, event = child:read_line()
+ if event == 1 then
+ errs[#errs + 1] = next
+ elseif event ~= 0 then
+ break
+ end
+
+ i = i + 1
+ if i > job.skip then
+ outs[#outs + 1] = next
+ end
+ until i >= job.skip + limit
+
+ child:start_kill()
+ if #errs > 0 then
+ fail(job, table.concat(errs, ""))
+ elseif job.skip > 0 and i < job.skip + limit then
+ ya.emit("peek", { math.max(0, i - limit), only_if = job.file.url, upper_bound = true })
+ else
+ ya.preview_widget(job, M.format(job, outs))
+ end
+end
+
+function M:seek(job) require("code"):seek(job) end
+
+function M.format(job, lines)
+ local format = job.args.format
+ if format ~= "url" then
+ local s = table.concat(lines, ""):gsub("\r", ""):gsub("\t", string.rep(" ", rt.preview.tab_size))
+ return ui.Text.parse(s):area(job.area)
+ end
+
+ for i = 1, #lines do
+ lines[i] = lines[i]:gsub("[\r\n]+$", "")
+
+ local icon = File({
+ url = Url(lines[i]),
+ cha = Cha { kind = lines[i]:sub(-1) == "/" and 1 or 0 },
+ }):icon()
+
+ if icon then
+ lines[i] = ui.Line { ui.Span(" " .. icon.text .. " "):style(icon.style), lines[i] }
+ end
+ end
+ return ui.Text(lines):area(job.area)
+end
+
+return M