From 62fcf27dfb422f3a7101477a1cd6adc4a5884e7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E9=9B=85=20=C2=B7=20Misaki=20Masa?= Date: Wed, 14 Aug 2024 15:03:38 +0800 Subject: [PATCH] feat: new `empty` previewer for empty and `/proc` files (#1482) --- yazi-config/preset/yazi.toml | 2 ++ yazi-plugin/preset/plugins/empty.lua | 49 ++++++++++++++++++++++++++++ yazi-plugin/src/elements/span.rs | 4 +++ yazi-plugin/src/elements/style.rs | 4 +++ yazi-plugin/src/isolate/peek.rs | 2 +- yazi-plugin/src/loader/loader.rs | 6 ++-- 6 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 yazi-plugin/preset/plugins/empty.lua diff --git a/yazi-config/preset/yazi.toml b/yazi-config/preset/yazi.toml index cd8a3f52..d21cfb07 100644 --- a/yazi-config/preset/yazi.toml +++ b/yazi-config/preset/yazi.toml @@ -122,6 +122,8 @@ previewers = [ # Font { mime = "font/*", run = "font" }, { mime = "application/vnd.ms-opentype", run = "font" }, + # Empty file + { mime = "inode/x-empty", run = "empty" }, # Fallback { name = "*", run = "file" }, ] diff --git a/yazi-plugin/preset/plugins/empty.lua b/yazi-plugin/preset/plugins/empty.lua new file mode 100644 index 00000000..5d2e9b46 --- /dev/null +++ b/yazi-plugin/preset/plugins/empty.lua @@ -0,0 +1,49 @@ +local M = {} + +function M:msg(s) + local p = ui.Paragraph(self.area, { + ui.Line { ui.Span(s):reverse() }, + }) + ya.preview_widgets(self, { p:wrap(ui.Paragraph.WRAP) }) +end + +function M:peek() + local path = tostring(self.file.url) + if path:sub(1, 6) ~= "/proc/" then + return self:msg("Empty file") + end + + local limit = self.area.h + local i, lines = 0, {} + local ok, err = pcall(function() + for line in io.lines(path) do + i = i + 1 + if i > self.skip + limit then + break + elseif i > self.skip then + lines[#lines + 1] = ui.Line(line) + end + end + end) + + if not ok then + self:msg(err) + elseif self.skip > 0 and i < self.skip + limit then + ya.manager_emit("peek", { math.max(0, i - limit), only_if = self.file.url, upper_bound = true }) + else + ya.preview_widgets(self, { ui.Paragraph(self.area, lines) }) + end +end + +function M:seek(units) + local h = cx.active.current.hovered + if h and h.url == self.file.url then + local step = math.floor(units * self.area.h / 10) + ya.manager_emit("peek", { + math.max(0, cx.active.preview.skip + step), + only_if = self.file.url, + }) + end +end + +return M diff --git a/yazi-plugin/src/elements/span.rs b/yazi-plugin/src/elements/span.rs index 96549f3c..1fa7a8ff 100644 --- a/yazi-plugin/src/elements/span.rs +++ b/yazi-plugin/src/elements/span.rs @@ -51,6 +51,10 @@ impl UserData for Span { ud.borrow_mut::()?.0.style.add_modifier |= ratatui::style::Modifier::RAPID_BLINK; Ok(ud) }); + methods.add_function("reverse", |_, ud: AnyUserData| { + ud.borrow_mut::()?.0.style.add_modifier |= ratatui::style::Modifier::REVERSED; + Ok(ud) + }); methods.add_function("hidden", |_, ud: AnyUserData| { ud.borrow_mut::()?.0.style.add_modifier |= ratatui::style::Modifier::HIDDEN; Ok(ud) diff --git a/yazi-plugin/src/elements/style.rs b/yazi-plugin/src/elements/style.rs index 67070b99..d58fef18 100644 --- a/yazi-plugin/src/elements/style.rs +++ b/yazi-plugin/src/elements/style.rs @@ -72,6 +72,10 @@ impl UserData for Style { ud.borrow_mut::()?.0.add_modifier |= ratatui::style::Modifier::RAPID_BLINK; Ok(ud) }); + methods.add_function("reverse", |_, ud: AnyUserData| { + ud.borrow_mut::()?.0.add_modifier |= ratatui::style::Modifier::REVERSED; + Ok(ud) + }); methods.add_function("hidden", |_, ud: AnyUserData| { ud.borrow_mut::()?.0.add_modifier |= ratatui::style::Modifier::HIDDEN; Ok(ud) diff --git a/yazi-plugin/src/isolate/peek.rs b/yazi-plugin/src/isolate/peek.rs index 15dd725c..e6a0d4be 100644 --- a/yazi-plugin/src/isolate/peek.rs +++ b/yazi-plugin/src/isolate/peek.rs @@ -47,7 +47,7 @@ pub fn peek(cmd: &Cmd, file: yazi_shared::fs::File, skip: usize) -> Cancellation if let Err(e) = result { if !e.to_string().contains("Peek task cancelled") { - error!("{e}"); + error!("{e:?}"); } } }); diff --git a/yazi-plugin/src/loader/loader.rs b/yazi-plugin/src/loader/loader.rs index 9a551253..fcfc01a6 100644 --- a/yazi-plugin/src/loader/loader.rs +++ b/yazi-plugin/src/loader/loader.rs @@ -1,6 +1,6 @@ use std::{borrow::Cow, collections::HashMap, ops::Deref}; -use anyhow::Result; +use anyhow::{Context, Result}; use mlua::{ExternalError, Lua, Table}; use parking_lot::RwLock; use tokio::fs; @@ -24,6 +24,7 @@ impl Loader { "archive" => &include_bytes!("../../preset/plugins/archive.lua")[..], "code" => include_bytes!("../../preset/plugins/code.lua"), "dds" => include_bytes!("../../preset/plugins/dds.lua"), + "empty" => include_bytes!("../../preset/plugins/empty.lua"), "extract" => include_bytes!("../../preset/plugins/extract.lua"), "file" => include_bytes!("../../preset/plugins/file.lua"), "folder" => include_bytes!("../../preset/plugins/folder.lua"), @@ -42,7 +43,8 @@ impl Loader { }; let b = if preset.is_empty() { - Cow::Owned(fs::read(BOOT.plugin_dir.join(format!("{name}.yazi/init.lua"))).await?) + let p = BOOT.plugin_dir.join(format!("{name}.yazi/init.lua")); + Cow::Owned(fs::read(&p).await.with_context(|| format!("failed to load plugin from {p:?}"))?) } else { Cow::Borrowed(preset) };