From 917e1f54a10445f2e25147c4b81a3c77d8233632 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E9=9B=85=20misaki=20masa?= Date: Sun, 6 Jul 2025 22:27:56 +0800 Subject: [PATCH] perf: do not listen for file changes in inactive tabs (#2958) --- yazi-core/src/mgr/commands/watch.rs | 18 ++++++------------ yazi-core/src/mgr/tabs.rs | 3 +++ yazi-core/src/mgr/watcher.rs | 5 ++--- yazi-parser/src/input/escape.rs | 12 +----------- yazi-parser/src/lib.rs | 2 ++ yazi-parser/src/mgr/unyank.rs | 12 +----------- yazi-parser/src/mgr/watch.rs | 12 +----------- yazi-parser/src/spot/close.rs | 12 +----------- yazi-parser/src/tab/follow.rs | 8 +------- yazi-parser/src/tab/leave.rs | 12 +----------- yazi-parser/src/tasks/close.rs | 12 +----------- yazi-parser/src/tasks/show.rs | 12 +----------- yazi-parser/src/void.rs | 11 +++++++++++ yazi-plugin/preset/plugins/archive.lua | 4 ++-- yazi-plugin/preset/plugins/extract.lua | 2 +- 15 files changed, 35 insertions(+), 102 deletions(-) create mode 100644 yazi-parser/src/void.rs diff --git a/yazi-core/src/mgr/commands/watch.rs b/yazi-core/src/mgr/commands/watch.rs index 48fcd16b..154318e4 100644 --- a/yazi-core/src/mgr/commands/watch.rs +++ b/yazi-core/src/mgr/commands/watch.rs @@ -1,4 +1,4 @@ -use std::collections::HashSet; +use std::iter; use yazi_parser::mgr::WatchOpt; @@ -7,16 +7,10 @@ use crate::mgr::Mgr; impl Mgr { #[yazi_codegen::command] pub fn watch(&mut self, _: WatchOpt) { - let mut to_watch = HashSet::with_capacity(3 * self.tabs.len()); - for tab in self.tabs.iter() { - to_watch.insert(tab.cwd()); - if let Some(ref p) = tab.parent { - to_watch.insert(&p.url); - } - if let Some(h) = tab.hovered().filter(|&h| h.is_dir()) { - to_watch.insert(&h.url); - } - } - self.watcher.watch(to_watch); + let it = iter::once(self.tabs.active().cwd()) + .chain(self.tabs.parent().map(|p| &p.url)) + .chain(self.tabs.hovered().filter(|h| h.is_dir()).map(|h| &h.url)); + + self.watcher.watch(it); } } diff --git a/yazi-core/src/mgr/tabs.rs b/yazi-core/src/mgr/tabs.rs index a1c23563..86827dbd 100644 --- a/yazi-core/src/mgr/tabs.rs +++ b/yazi-core/src/mgr/tabs.rs @@ -51,6 +51,9 @@ impl Tabs { #[inline] pub(super) fn active_mut(&mut self) -> &mut Tab { &mut self.items[self.cursor] } + #[inline] + pub fn parent(&self) -> Option<&Folder> { self.active().parent.as_ref() } + #[inline] pub fn current(&self) -> &Folder { &self.active().current } diff --git a/yazi-core/src/mgr/watcher.rs b/yazi-core/src/mgr/watcher.rs index 4943350b..0ef4eaee 100644 --- a/yazi-core/src/mgr/watcher.rs +++ b/yazi-core/src/mgr/watcher.rs @@ -51,9 +51,8 @@ impl Watcher { Self { in_tx, out_tx } } - pub(super) fn watch(&mut self, mut new: HashSet<&Url>) { - new.retain(|&u| u.is_regular()); - self.in_tx.send(new.into_iter().cloned().collect()).ok(); + pub(super) fn watch<'a>(&mut self, it: impl Iterator) { + self.in_tx.send(it.filter(|u| u.is_regular()).cloned().collect()).ok(); } pub(super) fn push_files(&self, urls: Vec) { diff --git a/yazi-parser/src/input/escape.rs b/yazi-parser/src/input/escape.rs index 8f6b5301..eae3a61a 100644 --- a/yazi-parser/src/input/escape.rs +++ b/yazi-parser/src/input/escape.rs @@ -1,11 +1 @@ -use yazi_shared::event::CmdCow; - -pub struct EscapeOpt; - -impl From for EscapeOpt { - fn from(_: CmdCow) -> Self { Self } -} - -impl From<()> for EscapeOpt { - fn from(_: ()) -> Self { Self } -} +pub type EscapeOpt = crate::VoidOpt; diff --git a/yazi-parser/src/lib.rs b/yazi-parser/src/lib.rs index af0da039..6806895d 100644 --- a/yazi-parser/src/lib.rs +++ b/yazi-parser/src/lib.rs @@ -1 +1,3 @@ yazi_macro::mod_pub!(cmp confirm help input mgr notify pick spot tab tasks which); + +yazi_macro::mod_flat!(void); diff --git a/yazi-parser/src/mgr/unyank.rs b/yazi-parser/src/mgr/unyank.rs index ce6a154e..b2575fae 100644 --- a/yazi-parser/src/mgr/unyank.rs +++ b/yazi-parser/src/mgr/unyank.rs @@ -1,11 +1 @@ -use yazi_shared::event::CmdCow; - -pub struct UnyankOpt; - -impl From for UnyankOpt { - fn from(_: CmdCow) -> Self { Self } -} - -impl From<()> for UnyankOpt { - fn from(_: ()) -> Self { Self } -} +pub type UnyankOpt = crate::VoidOpt; diff --git a/yazi-parser/src/mgr/watch.rs b/yazi-parser/src/mgr/watch.rs index 5bc2ca3a..a4217560 100644 --- a/yazi-parser/src/mgr/watch.rs +++ b/yazi-parser/src/mgr/watch.rs @@ -1,11 +1 @@ -use yazi_shared::event::CmdCow; - -pub struct WatchOpt; - -impl From for WatchOpt { - fn from(_: CmdCow) -> Self { Self } -} - -impl From<()> for WatchOpt { - fn from((): ()) -> Self { Self } -} +pub type WatchOpt = crate::VoidOpt; diff --git a/yazi-parser/src/spot/close.rs b/yazi-parser/src/spot/close.rs index 59462296..d6b58a69 100644 --- a/yazi-parser/src/spot/close.rs +++ b/yazi-parser/src/spot/close.rs @@ -1,11 +1 @@ -use yazi_shared::event::CmdCow; - -pub struct CloseOpt; - -impl From for CloseOpt { - fn from(_: CmdCow) -> Self { Self } -} - -impl From<()> for CloseOpt { - fn from(_: ()) -> Self { Self } -} +pub type CloseOpt = crate::VoidOpt; diff --git a/yazi-parser/src/tab/follow.rs b/yazi-parser/src/tab/follow.rs index 2edc8b92..c5fd9e27 100644 --- a/yazi-parser/src/tab/follow.rs +++ b/yazi-parser/src/tab/follow.rs @@ -1,7 +1 @@ -use yazi_shared::event::CmdCow; - -pub struct FollowOpt; - -impl From for FollowOpt { - fn from(_: CmdCow) -> Self { Self } -} +pub type FollowOpt = crate::VoidOpt; diff --git a/yazi-parser/src/tab/leave.rs b/yazi-parser/src/tab/leave.rs index 62c868cf..04c4b82e 100644 --- a/yazi-parser/src/tab/leave.rs +++ b/yazi-parser/src/tab/leave.rs @@ -1,11 +1 @@ -use yazi_shared::event::CmdCow; - -pub struct LeaveOpt; - -impl From<()> for LeaveOpt { - fn from(_: ()) -> Self { Self } -} - -impl From for LeaveOpt { - fn from(_: CmdCow) -> Self { Self } -} +pub type LeaveOpt = crate::VoidOpt; diff --git a/yazi-parser/src/tasks/close.rs b/yazi-parser/src/tasks/close.rs index 59462296..d6b58a69 100644 --- a/yazi-parser/src/tasks/close.rs +++ b/yazi-parser/src/tasks/close.rs @@ -1,11 +1 @@ -use yazi_shared::event::CmdCow; - -pub struct CloseOpt; - -impl From for CloseOpt { - fn from(_: CmdCow) -> Self { Self } -} - -impl From<()> for CloseOpt { - fn from(_: ()) -> Self { Self } -} +pub type CloseOpt = crate::VoidOpt; diff --git a/yazi-parser/src/tasks/show.rs b/yazi-parser/src/tasks/show.rs index 7cf9070c..106b02ad 100644 --- a/yazi-parser/src/tasks/show.rs +++ b/yazi-parser/src/tasks/show.rs @@ -1,11 +1 @@ -use yazi_shared::event::CmdCow; - -pub struct ShowOpt; - -impl From for ShowOpt { - fn from(_: CmdCow) -> Self { Self } -} - -impl From<()> for ShowOpt { - fn from(_: ()) -> Self { Self } -} +pub type ShowOpt = crate::VoidOpt; diff --git a/yazi-parser/src/void.rs b/yazi-parser/src/void.rs new file mode 100644 index 00000000..fd9f98bf --- /dev/null +++ b/yazi-parser/src/void.rs @@ -0,0 +1,11 @@ +use yazi_shared::event::CmdCow; + +pub struct VoidOpt; + +impl From for VoidOpt { + fn from(_: CmdCow) -> Self { Self } +} + +impl From<()> for VoidOpt { + fn from(_: ()) -> Self { Self } +} diff --git a/yazi-plugin/preset/plugins/archive.lua b/yazi-plugin/preset/plugins/archive.lua index 72c081d9..231d41ff 100644 --- a/yazi-plugin/preset/plugins/archive.lua +++ b/yazi-plugin/preset/plugins/archive.lua @@ -8,7 +8,7 @@ function M:peek(job) return require("empty").msg( job, code == 2 and "File list in this archive is encrypted" - or "Failed to start both `7zz` and `7z`. Do you have 7-zip installed?" + or "Failed to start either `7zz` or `7z`. Do you have 7-zip installed?" ) end @@ -65,7 +65,7 @@ function M.spawn_7z(args) local child = try("7zz") or try("7z") if not child then - return ya.err("Failed to start both `7zz` and `7z`, error: " .. last_err) + return ya.err("Failed to start either `7zz` or `7z`, error: " .. last_err) end return child, last_err end diff --git a/yazi-plugin/preset/plugins/extract.lua b/yazi-plugin/preset/plugins/extract.lua index a4d2d717..c7f68919 100644 --- a/yazi-plugin/preset/plugins/extract.lua +++ b/yazi-plugin/preset/plugins/extract.lua @@ -53,7 +53,7 @@ function M:try_with(from, pwd, to) local archive = require("archive") local child, err = archive.spawn_7z { "x", "-aou", "-sccUTF-8", "-p" .. pwd, "-o" .. tostring(tmp), tostring(from) } if not child then - fail("Failed to start both `7zz` and `7z`, error: " .. err) + fail("Failed to start either `7zz` or `7z`, error: " .. err) end local output, err = child:wait_with_output()