diff options
| author | TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> | 2025-12-11 11:46:09 +0900 |
|---|---|---|
| committer | TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> | 2025-12-11 11:46:09 +0900 |
| commit | 8c0fe8d0d0dd4bbd16c1095e25b2e3ffa1fdb0d3 (patch) | |
| tree | 597b8dfd730eda9b410fb6082b0bee7fcc7e70e2 /fedora/.config/yazi/plugins/zoom.yazi | |
| parent | 74713d79880967f5f0f8652c6741bc5fa63a8794 (diff) | |
updates
Diffstat (limited to 'fedora/.config/yazi/plugins/zoom.yazi')
| -rw-r--r-- | fedora/.config/yazi/plugins/zoom.yazi/README.md | 56 | ||||
| -rw-r--r-- | fedora/.config/yazi/plugins/zoom.yazi/main.lua | 119 |
2 files changed, 175 insertions, 0 deletions
diff --git a/fedora/.config/yazi/plugins/zoom.yazi/README.md b/fedora/.config/yazi/plugins/zoom.yazi/README.md new file mode 100644 index 0000000..9be8025 --- /dev/null +++ b/fedora/.config/yazi/plugins/zoom.yazi/README.md @@ -0,0 +1,56 @@ +> [!NOTE] +> The latest Yazi nightly build is required to use this plugin at the moment. + +# zoom.yazi + +Enlarge or shrink the preview image of a file, which is useful for magnifying small files for viewing. + +Supported formats: + +- Images - requires [ImageMagick](https://imagemagick.org/) (>= 7.1.1) + +Note that, the maximum size of enlarged images is limited by the [`max_width`][max_width] and [`max_height`][max_height] configuration options, so you may need to increase them as needed. + +https://github.com/user-attachments/assets/b28912b1-da63-43d3-a21f-b9e6767ed4a9 + +[max_width]: https://yazi-rs.github.io/docs/configuration/yazi#preview.max_width +[max_height]: https://yazi-rs.github.io/docs/configuration/yazi#preview.max_height + +## Installation + +```sh +ya pkg add yazi-rs/plugins:zoom +``` + +## Usage + +```toml +# keymap.toml +[[mgr.prepend_keymap]] +on = "+" +run = "plugin zoom 1" +desc = "Zoom in hovered file" + +[[mgr.prepend_keymap]] +on = "-" +run = "plugin zoom -1" +desc = "Zoom out hovered file" +``` + +## Advanced + +If you want to apply a default zoom parameter to image previews, you can specify it while setting this plugin up as a custom previewer, for example: + +```toml +[[plugin.prepend_previewers]] +mime = "image/{jpeg,png,webp}" +run = "zoom 5" +``` + +## TODO + +- [ ] Support more file types (e.g., videos, PDFs), PRs welcome! + +## License + +This plugin is MIT-licensed. For more information check the [LICENSE](LICENSE) file. diff --git a/fedora/.config/yazi/plugins/zoom.yazi/main.lua b/fedora/.config/yazi/plugins/zoom.yazi/main.lua new file mode 100644 index 0000000..8aea0cd --- /dev/null +++ b/fedora/.config/yazi/plugins/zoom.yazi/main.lua @@ -0,0 +1,119 @@ +--- @since 25.6.11 + +local get = ya.sync(function(st, url) return st.last == url and st.level end) + +local save = ya.sync(function(st, url, new) + local h = cx.active.current.hovered + if h and h.url == url then + st.last, st.level = url, new + return true + end +end) + +local lock = ya.sync(function(st, url, old, new) + if st.last == url and st.level == old then + st.level = new + return true + end +end) + +local move = ya.sync(function(st) + local h = cx.active.current.hovered + if not h then + return + end + + if st.last ~= h.url then + st.last, st.level = Url(h.url), 0 + end + + return { url = h.url, level = st.level } +end) + +local function end_(job, err) + if not job.old_level then + ya.preview_widget(job, err and ui.Text(err):area(job.area):wrap(ui.Wrap.YES)) + elseif err then + ya.notify { title = "Zoom", content = tostring(err), timeout = 5, level = "error" } + end +end + +local function canvas(area) + local cw, ch = rt.term.cell_size() + if not cw then + return rt.preview.max_width, rt.preview.max_height + end + + return math.min(rt.preview.max_width, math.floor(area.w * cw)), + math.min(rt.preview.max_height, math.floor(area.h * ch)) +end + +local function peek(_, job) + local url = job.file.url + local info, err = ya.image_info(url) + if not info then + return end_(job, Err("Failed to get image info: %s", err)) + end + + local level = ya.clamp(-10, job.new_level or get(Url(url)) or tonumber(job.args[1]) or 0, 10) + local sync = function() + if job.old_level then + return lock(url, job.old_level, level) + else + return save(url, level) + end + end + + local max_w, max_h = canvas(job.area) + local min_w, min_h = math.min(max_w, info.w), math.min(max_h, info.h) + local new_w = min_w + math.floor(min_w * level * 0.1) + local new_h = min_h + math.floor(min_h * level * 0.1) + if new_w > max_w or new_h > max_h then + if job.old_level then + return sync() -- Image larger than available preview area after zooming + else + new_w, new_h = max_w, max_h -- Run as a previewer, render the image anyway + end + end + + local tmp = os.tmpname() + -- stylua: ignore + local status, err = Command("magick"):arg { + tostring(url), + "-auto-orient", "-strip", + "-sample", string.format("%dx%d", new_w, new_h), + "-quality", rt.preview.image_quality, + string.format("JPG:%s", tmp), + }:status() + + if not status then + end_(job, Err("Failed to run `magick` command: %s", err)) + elseif not status.success then + end_(job, Err("`magick` command exited with error code %d", status.code)) + elseif sync() then + ya.image_show(Url(tmp), job.area) + end + end_(job) +end + +local function entry(self, job) + local st = move() + if not st then + return + end + + local motion = tonumber(job.args[1]) or 0 + local new = ya.clamp(-10, st.level + motion, 10) + if new ~= st.level then + peek(self, { + area = ui.area("preview"), + args = {}, + file = { url = st.url }, -- FIXME: use `File` instead of a dummy file + skip = 0, + new_level = new, + old_level = st.level, + }) + end +end + +return { peek = peek, entry = entry } |
