From e7dc971416af2c59b0d1498579102318885642ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E9=9B=85=20=C2=B7=20Misaki=20Masa?= Date: Wed, 10 Apr 2024 08:31:03 +0800 Subject: [PATCH] fix: file list expansion arguments (`$@`, `$*`) of shell command under opener rules are out of order (#890) --- yazi-core/src/manager/commands/bulk_rename.rs | 2 +- yazi-core/src/manager/commands/open.rs | 4 ++- yazi-core/src/manager/commands/remove.rs | 2 +- yazi-core/src/manager/commands/yank.rs | 6 ++--- yazi-core/src/manager/manager.rs | 8 +++--- yazi-core/src/tab/commands/copy.rs | 2 +- yazi-core/src/tab/commands/shell.rs | 2 +- yazi-core/src/tab/tab.rs | 26 ++++++++++--------- 8 files changed, 28 insertions(+), 24 deletions(-) diff --git a/yazi-core/src/manager/commands/bulk_rename.rs b/yazi-core/src/manager/commands/bulk_rename.rs index 12573315..79425ca3 100644 --- a/yazi-core/src/manager/commands/bulk_rename.rs +++ b/yazi-core/src/manager/commands/bulk_rename.rs @@ -15,7 +15,7 @@ impl Manager { }; let cwd = self.cwd().clone(); - let old: Vec<_> = self.selected_or_hovered(true); + let old: Vec<_> = self.selected_or_hovered(true).collect(); let root = max_common_root(&old); let old: Vec<_> = old.into_iter().map(|p| p.strip_prefix(&root).unwrap().to_owned()).collect(); diff --git a/yazi-core/src/manager/commands/open.rs b/yazi-core/src/manager/commands/open.rs index d4e5f586..79c31abb 100644 --- a/yazi-core/src/manager/commands/open.rs +++ b/yazi-core/src/manager/commands/open.rs @@ -33,7 +33,9 @@ impl Manager { }; let opt = opt.into() as Opt; - let selected = if opt.hovered { vec![&hovered] } else { self.selected_or_hovered(false) }; + let selected = + if opt.hovered { vec![&hovered] } else { self.selected_or_hovered(true).collect() }; + if Self::quit_with_selected(&selected) { return; } diff --git a/yazi-core/src/manager/commands/remove.rs b/yazi-core/src/manager/commands/remove.rs index 35381403..356f926a 100644 --- a/yazi-core/src/manager/commands/remove.rs +++ b/yazi-core/src/manager/commands/remove.rs @@ -27,7 +27,7 @@ impl Manager { } let mut opt = opt.into() as Opt; - opt.targets = self.selected_or_hovered(false).into_iter().cloned().collect(); + opt.targets = self.selected_or_hovered(false).cloned().collect(); if opt.force { return self.remove_do(opt, tasks); diff --git a/yazi-core/src/manager/commands/yank.rs b/yazi-core/src/manager/commands/yank.rs index 3073ced0..0532e291 100644 --- a/yazi-core/src/manager/commands/yank.rs +++ b/yazi-core/src/manager/commands/yank.rs @@ -17,10 +17,8 @@ impl Manager { return; } - self.yanked = Yanked { - cut: opt.into().cut, - urls: self.selected_or_hovered(false).into_iter().cloned().collect(), - }; + self.yanked = + Yanked { cut: opt.into().cut, urls: self.selected_or_hovered(false).cloned().collect() }; self.active_mut().escape_select(); Pubsub::pub_from_yank(self.yanked.cut, &self.yanked.urls); diff --git a/yazi-core/src/manager/manager.rs b/yazi-core/src/manager/manager.rs index eab2304f..38f6d671 100644 --- a/yazi-core/src/manager/manager.rs +++ b/yazi-core/src/manager/manager.rs @@ -53,10 +53,12 @@ impl Manager { pub fn hovered_folder(&self) -> Option<&Folder> { self.tabs.active().hovered_folder() } #[inline] - pub fn selected_or_hovered(&self, sorted: bool) -> Vec<&Url> { - self.tabs.active().selected_or_hovered(sorted) + pub fn selected_or_hovered(&self, reorder: bool) -> Box + '_> { + self.tabs.active().selected_or_hovered(reorder) } #[inline] - pub fn hovered_and_selected(&self) -> Vec<&Url> { self.tabs.active().hovered_and_selected() } + pub fn hovered_and_selected(&self, reorder: bool) -> Box + '_> { + self.tabs.active().hovered_and_selected(reorder) + } } diff --git a/yazi-core/src/tab/commands/copy.rs b/yazi-core/src/tab/commands/copy.rs index ba22eff8..f2af284d 100644 --- a/yazi-core/src/tab/commands/copy.rs +++ b/yazi-core/src/tab/commands/copy.rs @@ -20,7 +20,7 @@ impl Tab { } let mut s = OsString::new(); - let mut it = self.selected_or_hovered(true).into_iter().peekable(); + let mut it = self.selected_or_hovered(true).peekable(); while let Some(u) = it.next() { s.push(match opt.type_.as_str() { "path" => u.as_os_str(), diff --git a/yazi-core/src/tab/commands/shell.rs b/yazi-core/src/tab/commands/shell.rs index b9ae7dcb..ec566163 100644 --- a/yazi-core/src/tab/commands/shell.rs +++ b/yazi-core/src/tab/commands/shell.rs @@ -31,7 +31,7 @@ impl Tab { } let mut opt = opt.into() as Opt; - let selected = self.hovered_and_selected().into_iter().cloned().collect(); + let selected = self.hovered_and_selected(true).cloned().collect(); tokio::spawn(async move { if !opt.confirm || opt.run.is_empty() { diff --git a/yazi-core/src/tab/tab.rs b/yazi-core/src/tab/tab.rs index a5aa740c..35a37272 100644 --- a/yazi-core/src/tab/tab.rs +++ b/yazi-core/src/tab/tab.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use std::{collections::HashMap, iter}; use anyhow::Result; use tokio::task::JoinHandle; @@ -34,27 +34,29 @@ impl Tab { impl Tab { // --- Current - pub fn selected_or_hovered(&self, sorted: bool) -> Vec<&Url> { + pub fn selected_or_hovered(&self, reorder: bool) -> Box + '_> { if self.selected.is_empty() { - self.current.hovered().map(|h| vec![&h.url]).unwrap_or_default() - } else if !sorted { - self.selected.keys().collect() + Box::new(self.current.hovered().map(|h| vec![&h.url]).unwrap_or_default().into_iter()) + } else if !reorder { + Box::new(self.selected.keys()) } else { let mut vec: Vec<_> = self.selected.iter().collect(); vec.sort_unstable_by(|a, b| a.1.cmp(b.1)); - vec.into_iter().map(|(k, _)| k).collect() + Box::new(vec.into_iter().map(|(k, _)| k)) } } - pub fn hovered_and_selected(&self) -> Vec<&Url> { - let Some(h) = self.current.hovered() else { - return vec![]; - }; + pub fn hovered_and_selected(&self, reorder: bool) -> Box + '_> { + let Some(h) = self.current.hovered() else { return Box::new(iter::empty()) }; if self.selected.is_empty() { - vec![&h.url, &h.url] + Box::new([&h.url, &h.url].into_iter()) + } else if !reorder { + Box::new([&h.url].into_iter().chain(self.selected.keys())) } else { - [&h.url].into_iter().chain(self.selected.keys()).collect() + let mut vec: Vec<_> = self.selected.iter().collect(); + vec.sort_unstable_by(|a, b| a.1.cmp(b.1)); + Box::new([&h.url].into_iter().chain(vec.into_iter().map(|(k, _)| k))) } }