This commit is contained in:
sxyazi 2025-10-06 23:01:15 +08:00
parent c607239d6b
commit 3dea25e4f0
No known key found for this signature in database
5 changed files with 31 additions and 14 deletions

View file

@ -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());

View file

@ -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,

View file

@ -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,

View file

@ -245,11 +245,15 @@ impl<T> Splatter<T> {
}
// 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<usize>) -> impl Iterator<Item = Url<'_>> {
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<Url<'_>> {
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<Item = Url<'_>> { iter::empty() }

View file

@ -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<UrlCow<'static>>) {
pub async fn process_exec(
cwd: UrlBuf,
cmd: OsString,
args: Vec<UrlCow<'static>>,
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
})));