mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
feat: preserve selection order for directories with many files
This commit is contained in:
parent
8ef28ec678
commit
f73f1e1319
1 changed files with 14 additions and 10 deletions
|
|
@ -37,38 +37,42 @@ impl Mgr {
|
||||||
}
|
}
|
||||||
|
|
||||||
let cwd = self.cwd().clone();
|
let cwd = self.cwd().clone();
|
||||||
let (mut done, mut todo) = (Vec::with_capacity(selected.len()), vec![]);
|
let (mut targets, mut todo) = (vec![Default::default(); selected.len()], vec![]);
|
||||||
for u in selected {
|
|
||||||
|
for (i, u) in selected.into_iter().enumerate() {
|
||||||
if self.mimetype.contains(u) {
|
if self.mimetype.contains(u) {
|
||||||
done.push((u.clone(), ""));
|
targets[i] = (u.clone(), "");
|
||||||
} else if self.guess_folder(u) {
|
} else if self.guess_folder(u) {
|
||||||
done.push((u.clone(), MIME_DIR));
|
targets[i] = (u.clone(), MIME_DIR);
|
||||||
} else {
|
} else {
|
||||||
todo.push(u.clone());
|
targets[i] = (u.clone(), "");
|
||||||
|
todo.push(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if todo.is_empty() {
|
if todo.is_empty() {
|
||||||
return self
|
return self
|
||||||
.open_do(OpenDoOpt { cwd, hovered, targets: done, interactive: opt.interactive }, tasks);
|
.open_do(OpenDoOpt { cwd, hovered, targets, interactive: opt.interactive }, tasks);
|
||||||
}
|
}
|
||||||
|
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
let mut files = Vec::with_capacity(todo.len());
|
let mut files = Vec::with_capacity(todo.len());
|
||||||
for u in todo {
|
for i in todo.into_iter().rev() {
|
||||||
if let Ok(f) = File::new(u).await {
|
if let Ok(f) = File::new(targets[i].0.clone()).await {
|
||||||
|
targets[i] = (f.url_owned(), "");
|
||||||
files.push(f);
|
files.push(f);
|
||||||
|
} else {
|
||||||
|
targets.remove(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
done.extend(files.iter().map(|f| (f.url_owned(), "")));
|
|
||||||
for (fetcher, files) in YAZI.plugin.mime_fetchers(files) {
|
for (fetcher, files) in YAZI.plugin.mime_fetchers(files) {
|
||||||
if let Err(e) = isolate::fetch(CmdCow::from(&fetcher.run), files).await {
|
if let Err(e) = isolate::fetch(CmdCow::from(&fetcher.run), files).await {
|
||||||
error!("Fetch mime failed on opening: {e}");
|
error!("Fetch mime failed on opening: {e}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MgrProxy::open_do(OpenDoOpt { cwd, hovered, targets: done, interactive: opt.interactive });
|
MgrProxy::open_do(OpenDoOpt { cwd, hovered, targets, interactive: opt.interactive });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue