diff --git a/yazi-config/src/plugin/plugin.rs b/yazi-config/src/plugin/plugin.rs index 34cf4645..8c73ab80 100644 --- a/yazi-config/src/plugin/plugin.rs +++ b/yazi-config/src/plugin/plugin.rs @@ -31,23 +31,51 @@ pub struct PluginRule { impl Default for Plugin { fn default() -> Self { #[derive(Deserialize)] - struct Outer { - plugin: Plugin, + struct Shadow { + preloaders: Vec, + #[serde(default)] + prepend_preloaders: Vec, + #[serde(default)] + append_preloaders: Vec, + + previewers: Vec, + #[serde(default)] + prepend_previewers: Vec, + #[serde(default)] + append_previewers: Vec, } - let mut plugin = toml::from_str::(&MERGED_YAZI).unwrap().plugin; - if plugin.preloaders.len() > MAX_PRELOADERS as usize { + #[derive(Deserialize)] + struct Outer { + plugin: Shadow, + } + + let mut shadow = toml::from_str::(&MERGED_YAZI).unwrap().plugin; + shadow.preloaders = shadow + .prepend_preloaders + .into_iter() + .chain(shadow.preloaders) + .chain(shadow.append_preloaders) + .collect(); + shadow.previewers = shadow + .prepend_previewers + .into_iter() + .chain(shadow.previewers) + .chain(shadow.append_previewers) + .collect(); + + if shadow.preloaders.len() > MAX_PRELOADERS as usize { panic!("Too many preloaders"); } - for (i, preloader) in plugin.preloaders.iter_mut().enumerate() { + for (i, preloader) in shadow.preloaders.iter_mut().enumerate() { if preloader.sync { panic!("Preloaders cannot be synchronous"); } preloader.id = i as u8; } - plugin + Self { preloaders: shadow.preloaders, previewers: shadow.previewers } } } diff --git a/yazi-core/src/manager/commands/refresh.rs b/yazi-core/src/manager/commands/refresh.rs index 1702e6cf..2446b286 100644 --- a/yazi-core/src/manager/commands/refresh.rs +++ b/yazi-core/src/manager/commands/refresh.rs @@ -24,5 +24,7 @@ impl Manager { self.hover(None); self.update_paged((), tasks); + + tasks.preload_sorted(&self.current().files); } } diff --git a/yazi-core/src/tab/commands/sort.rs b/yazi-core/src/tab/commands/sort.rs index fdf0b270..c9e3ce74 100644 --- a/yazi-core/src/tab/commands/sort.rs +++ b/yazi-core/src/tab/commands/sort.rs @@ -3,10 +3,10 @@ use std::str::FromStr; use yazi_config::manager::SortBy; use yazi_shared::event::Exec; -use crate::{manager::Manager, tab::Tab}; +use crate::{manager::Manager, tab::Tab, tasks::Tasks}; impl Tab { - pub fn sort(&mut self, e: &Exec) { + pub fn sort(&mut self, e: &Exec, tasks: &Tasks) { if let Some(by) = e.args.first() { self.conf.sort_by = SortBy::from_str(by).unwrap_or_default(); } @@ -16,5 +16,7 @@ impl Tab { self.apply_files_attrs(); Manager::_update_paged(); + + tasks.preload_sorted(&self.current.files); } } diff --git a/yazi-fm/src/executor.rs b/yazi-fm/src/executor.rs index bd367ef9..6afc5c17 100644 --- a/yazi-fm/src/executor.rs +++ b/yazi-fm/src/executor.rs @@ -94,9 +94,9 @@ impl<'a> Executor<'a> { return self.app.cx.manager.$name(exec, $($args),*); } }; - (ACTIVE, $name:ident) => { + (ACTIVE, $name:ident $(,$args:expr)*) => { if exec.cmd == stringify!($name) { - return self.app.cx.manager.active_mut().$name(exec); + return self.app.cx.manager.active_mut().$name(exec, $($args),*); } }; (TABS, $name:ident) => { @@ -159,7 +159,7 @@ impl<'a> Executor<'a> { on!(ACTIVE, find_arrow); // Sorting - on!(ACTIVE, sort); + on!(ACTIVE, sort, &self.app.cx.tasks); // Tabs on!(TABS, create);