Skip to content

Commit 18d9dbe

Browse files
committed
feat: new --cwd parameter for the shell command and fs.cwd() API
1 parent 63ad289 commit 18d9dbe

File tree

23 files changed

+128
-88
lines changed

23 files changed

+128
-88
lines changed

Cargo.lock

Lines changed: 18 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

yazi-boot/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ serde = { workspace = true }
2222

2323
[build-dependencies]
2424
clap = { workspace = true }
25-
clap_complete = "4.5.38"
25+
clap_complete = "4.5.39"
2626
clap_complete_fig = "4.5.2"
2727
clap_complete_nushell = "4.5.4"
2828
vergen-gitcl = { version = "1.0.2", features = [ "build", "rustc" ] }

yazi-cli/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ yazi-shared = { path = "../yazi-shared", version = "0.4.2" }
3030
# External build dependencies
3131
anyhow = { workspace = true }
3232
clap = { workspace = true }
33-
clap_complete = "4.5.38"
33+
clap_complete = "4.5.39"
3434
clap_complete_fig = "4.5.2"
3535
clap_complete_nushell = "4.5.4"
3636
serde_json = { workspace = true }

yazi-core/src/manager/commands/bulk_rename.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ impl Manager {
2222
let root = max_common_root(&old);
2323
let old: Vec<_> = old.into_iter().map(|p| p.strip_prefix(&root).unwrap().to_owned()).collect();
2424

25+
let cwd = self.cwd().clone();
2526
tokio::spawn(async move {
2627
let tmp = PREVIEW.tmpfile("bulk");
2728
let s = old.iter().map(|o| o.as_os_str()).collect::<Vec<_>>().join(OsStr::new("\n"));
@@ -34,8 +35,11 @@ impl Manager {
3435
.await?;
3536

3637
defer! { tokio::spawn(fs::remove_file(tmp.clone())); }
37-
TasksProxy::process_exec(vec![OsString::new(), tmp.to_owned().into()], Cow::Borrowed(opener))
38-
.await;
38+
TasksProxy::process_exec(Cow::Borrowed(opener), cwd, vec![
39+
OsString::new(),
40+
tmp.to_owned().into(),
41+
])
42+
.await;
3943

4044
let _permit = HIDER.acquire().await.unwrap();
4145
defer!(AppProxy::resume());

yazi-core/src/manager/commands/open.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ impl Manager {
4040
return;
4141
}
4242

43+
let cwd = self.cwd().clone();
4344
let (mut done, mut todo) = (Vec::with_capacity(selected.len()), vec![]);
4445
for u in selected {
4546
if self.mimetype.contains(u) {
@@ -53,7 +54,7 @@ impl Manager {
5354

5455
if todo.is_empty() {
5556
return self
56-
.open_do(OpenDoOpt { hovered, targets: done, interactive: opt.interactive }, tasks);
57+
.open_do(OpenDoOpt { cwd, hovered, targets: done, interactive: opt.interactive }, tasks);
5758
}
5859

5960
tokio::spawn(async move {
@@ -71,7 +72,12 @@ impl Manager {
7172
}
7273
}
7374

74-
ManagerProxy::open_do(OpenDoOpt { hovered, targets: done, interactive: opt.interactive });
75+
ManagerProxy::open_do(OpenDoOpt {
76+
cwd,
77+
hovered,
78+
targets: done,
79+
interactive: opt.interactive,
80+
});
7581
});
7682
}
7783

@@ -88,7 +94,7 @@ impl Manager {
8894
if targets.is_empty() {
8995
return;
9096
} else if !opt.interactive {
91-
return tasks.process_from_files(opt.hovered, targets);
97+
return tasks.process_from_files(opt.cwd, opt.hovered, targets);
9298
}
9399

94100
let openers: Vec<_> = OPEN.common_openers(&targets);
@@ -102,7 +108,7 @@ impl Manager {
102108
openers.iter().map(|o| o.desc.clone()).collect(),
103109
));
104110
if let Ok(choice) = result.await {
105-
TasksProxy::open_with(urls, Cow::Borrowed(openers[choice]));
111+
TasksProxy::open_with(Cow::Borrowed(openers[choice]), opt.cwd, urls);
106112
}
107113
});
108114
}

yazi-core/src/tab/commands/shell.rs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,34 @@ use std::{borrow::Cow, fmt::Display};
33
use anyhow::bail;
44
use yazi_config::{open::Opener, popup::InputCfg};
55
use yazi_proxy::{AppProxy, InputProxy, TasksProxy};
6-
use yazi_shared::event::{CmdCow, Data};
6+
use yazi_shared::{event::{CmdCow, Data}, url::Url};
77

88
use crate::tab::Tab;
99

1010
pub struct Opt {
11-
run: Cow<'static, str>,
11+
run: Cow<'static, str>,
12+
cwd: Option<Url>,
13+
1214
block: bool,
1315
orphan: bool,
1416
interactive: bool,
15-
cursor: Option<usize>,
17+
18+
cursor: Option<usize>,
1619
}
1720

1821
impl TryFrom<CmdCow> for Opt {
1922
type Error = anyhow::Error;
2023

2124
fn try_from(mut c: CmdCow) -> Result<Self, Self::Error> {
2225
let me = Self {
23-
run: c.take_first_str().unwrap_or_default(),
26+
run: c.take_first_str().unwrap_or_default(),
27+
cwd: c.take_url("cwd"),
28+
2429
block: c.bool("block"),
2530
orphan: c.bool("orphan"),
2631
interactive: c.bool("interactive"),
27-
cursor: c.get("cursor").and_then(Data::as_usize),
32+
33+
cursor: c.get("cursor").and_then(Data::as_usize),
2834
};
2935

3036
if me.cursor.is_some_and(|c| c > me.run.chars().count()) {
@@ -46,6 +52,7 @@ impl Tab {
4652
Err(e) => return AppProxy::notify_warn("`shell` command", e),
4753
};
4854

55+
let cwd = opt.cwd.take().unwrap_or_else(|| self.cwd().clone());
4956
let selected = self.hovered_and_selected(true).cloned().collect();
5057
tokio::spawn(async move {
5158
if opt.interactive {
@@ -61,7 +68,6 @@ impl Tab {
6168
}
6269

6370
TasksProxy::open_with(
64-
selected,
6571
Cow::Owned(Opener {
6672
run: opt.run.into_owned(),
6773
block: opt.block,
@@ -70,6 +76,8 @@ impl Tab {
7076
for_: None,
7177
spread: true,
7278
}),
79+
cwd,
80+
selected,
7381
);
7482
});
7583
}

yazi-core/src/tasks/commands/open_with.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ impl Tasks {
66
pub fn open_with(&mut self, opt: impl TryInto<OpenWithOpt>) {
77
if let Ok(opt) = opt.try_into() {
88
self.process_from_opener(
9+
opt.cwd,
910
opt.opener,
1011
opt.targets.into_iter().map(|u| u.into_path().into_os_string()).collect(),
1112
);

yazi-core/src/tasks/commands/process_exec.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::tasks::Tasks;
55
impl Tasks {
66
pub fn process_exec(&mut self, opt: impl TryInto<ProcessExecOpt>) {
77
if let Ok(opt) = opt.try_into() {
8-
self.scheduler.process_open(opt.opener, opt.args, Some(opt.done));
8+
self.scheduler.process_open(opt);
99
}
1010
}
1111
}

yazi-core/src/tasks/process.rs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
use std::{borrow::Cow, collections::HashMap, ffi::OsString, mem};
22

33
use yazi_config::{OPEN, open::Opener};
4+
use yazi_proxy::options::ProcessExecOpt;
45
use yazi_shared::url::Url;
56

67
use super::Tasks;
78

89
impl Tasks {
9-
pub fn process_from_files(&self, hovered: Url, targets: Vec<(Url, Cow<str>)>) {
10+
pub fn process_from_files(&self, cwd: Url, hovered: Url, targets: Vec<(Url, Cow<str>)>) {
1011
let mut openers = HashMap::new();
1112
for (url, mime) in targets {
1213
if let Some(opener) = OPEN.openers(&url, mime).and_then(|o| o.first().copied()) {
@@ -15,27 +16,38 @@ impl Tasks {
1516
}
1617
for (opener, args) in openers {
1718
self.process_from_opener(
19+
cwd.clone(),
1820
Cow::Borrowed(opener),
1921
args.into_iter().map(|u| u.into_path().into_os_string()).collect(),
2022
);
2123
}
2224
}
2325

24-
pub fn process_from_opener(&self, opener: Cow<'static, Opener>, mut args: Vec<OsString>) {
26+
pub fn process_from_opener(
27+
&self,
28+
cwd: Url,
29+
opener: Cow<'static, Opener>,
30+
mut args: Vec<OsString>,
31+
) {
2532
if opener.spread {
26-
self.scheduler.process_open(opener, args, None);
33+
self.scheduler.process_open(ProcessExecOpt { cwd, opener, args, done: None });
2734
return;
2835
}
2936
if args.is_empty() {
3037
return;
3138
}
3239
if args.len() == 2 {
33-
self.scheduler.process_open(opener, args, None);
40+
self.scheduler.process_open(ProcessExecOpt { cwd, opener, args, done: None });
3441
return;
3542
}
3643
let hovered = mem::take(&mut args[0]);
3744
for target in args.into_iter().skip(1) {
38-
self.scheduler.process_open(opener.clone(), vec![hovered.clone(), target], None);
45+
self.scheduler.process_open(ProcessExecOpt {
46+
cwd: cwd.clone(),
47+
opener: opener.clone(),
48+
args: vec![hovered.clone(), target],
49+
done: None,
50+
});
3951
}
4052
}
4153
}

yazi-plugin/preset/plugins/zoxide.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ local function setup(_, opts)
6767
"cd",
6868
function()
6969
ya.manager_emit("shell", {
70+
cwd = fs.cwd(),
7071
orphan = true,
7172
"zoxide add " .. ya.quote(tostring(cx.active.current.cwd)),
7273
})

0 commit comments

Comments
 (0)