diff --git a/yazi-actor/src/mgr/bulk_rename.rs b/yazi-actor/src/mgr/bulk_rename.rs index 857a408f..71340eb2 100644 --- a/yazi-actor/src/mgr/bulk_rename.rs +++ b/yazi-actor/src/mgr/bulk_rename.rs @@ -7,7 +7,7 @@ use scopeguard::defer; use tokio::io::AsyncWriteExt; use yazi_config::{YAZI, opener::OpenerRule}; use yazi_dds::Pubsub; -use yazi_fs::{File, FilesOp, max_common_root, path::skip_url, provider::{FileBuilder, Provider, local::{Gate, Local}}}; +use yazi_fs::{File, FilesOp, Splatter, max_common_root, path::skip_url, provider::{FileBuilder, Provider, local::{Gate, Local}}}; use yazi_macro::{err, succ}; use yazi_parser::VoidOpt; use yazi_proxy::{AppProxy, HIDER, TasksProxy}; @@ -51,8 +51,14 @@ impl Actor for BulkRename { .await?; defer! { tokio::spawn(Local.remove_file(tmp.clone())); } - TasksProxy::process_exec(opener, cwd, vec![UrlCow::default(), UrlBuf::from(&tmp).into()]) - .await; + TasksProxy::process_exec( + cwd, + Splatter::new(&[UrlCow::default(), Url::regular(&tmp).into()]).splat(&opener.run), + vec![UrlCow::default(), UrlBuf::from(&tmp).into()], + opener.block, + opener.orphan, + ) + .await; let _permit = HIDER.acquire().await.unwrap(); defer!(AppProxy::resume()); diff --git a/yazi-actor/src/mgr/open_do.rs b/yazi-actor/src/mgr/open_do.rs index 0b36d464..151f6de2 100644 --- a/yazi-actor/src/mgr/open_do.rs +++ b/yazi-actor/src/mgr/open_do.rs @@ -45,12 +45,12 @@ impl Actor for OpenDo { if let Ok(choice) = pick.await { TasksProxy::open_shell_compat(ProcessOpenOpt { cwd: opt.cwd, - cmd: Splatter::new(&urls[..]).splat(&openers[choice].run), + cmd: Splatter::new(&urls).splat(&openers[choice].run), args: urls, block: openers[choice].block, orphan: openers[choice].orphan, done: None, - spread: false, + spread: openers[choice].spread, }); } }); @@ -70,7 +70,7 @@ impl OpenDo { for (opener, args) in openers { cx.tasks.open_shell_compat(ProcessOpenOpt { cwd: cwd.clone(), - cmd: Splatter::new(&args[..]).splat(&opener.run), + cmd: Splatter::new(&args).splat(&opener.run), args, block: opener.block, orphan: opener.orphan, diff --git a/yazi-actor/src/mgr/shell.rs b/yazi-actor/src/mgr/shell.rs index 608b8698..3d08ff73 100644 --- a/yazi-actor/src/mgr/shell.rs +++ b/yazi-actor/src/mgr/shell.rs @@ -40,7 +40,7 @@ impl Actor for Shell { TasksProxy::open_shell_compat(ProcessOpenOpt { cwd, - cmd: Splatter::new(&selected[..]).splat(opt.run.as_ref()), + cmd: Splatter::new(&selected).splat(opt.run.as_ref()), args: selected, block: opt.block, orphan: opt.orphan, diff --git a/yazi-fs/src/splatter.rs b/yazi-fs/src/splatter.rs index 63f3f2b6..9db2b6cf 100644 --- a/yazi-fs/src/splatter.rs +++ b/yazi-fs/src/splatter.rs @@ -245,11 +245,15 @@ impl Splatter { } // TODO: remove -impl<'a> Splatable for &'a [UrlCow<'a>] { +impl<'a, T> Splatable for &'a T +where + T: AsRef<[UrlCow<'a>]>, +{ fn tab(&self) -> usize { 0 } fn selected(&self, tab: usize, idx: Option) -> impl Iterator> { self + .as_ref() .iter() .filter(move |_| tab == 1) .map(|u| u.as_url()) @@ -258,7 +262,7 @@ impl<'a> Splatable for &'a [UrlCow<'a>] { } fn hovered(&self, tab: usize) -> Option> { - self.first().filter(|_| tab == 1).map(|u| u.as_url()) + self.as_ref().first().filter(|_| tab == 1).map(|u| u.as_url()) } fn yanked(&self) -> impl Iterator> { iter::empty() } diff --git a/yazi-proxy/src/tasks.rs b/yazi-proxy/src/tasks.rs index b951bda8..cdcb8254 100644 --- a/yazi-proxy/src/tasks.rs +++ b/yazi-proxy/src/tasks.rs @@ -1,5 +1,6 @@ +use std::ffi::OsString; + use tokio::sync::oneshot; -use yazi_config::opener::OpenerRule; use yazi_macro::{emit, relay}; use yazi_parser::tasks::ProcessOpenOpt; use yazi_shared::url::{UrlBuf, UrlCow}; @@ -12,14 +13,20 @@ impl TasksProxy { emit!(Call(relay!(tasks:open_shell_compat).with_any("opt", opt))); } - pub async fn process_exec(opener: &OpenerRule, cwd: UrlBuf, args: Vec>) { + pub async fn process_exec( + cwd: UrlBuf, + cmd: OsString, + args: Vec>, + block: bool, + orphan: bool, + ) { let (tx, rx) = oneshot::channel(); emit!(Call(relay!(tasks:process_open).with_any("opt", ProcessOpenOpt { cwd, - cmd: opener.run.clone().into(), + cmd, args, - block: opener.block, - orphan: opener.orphan, + block, + orphan, done: Some(tx), spread: false })));