From 5531874a9a6b2a787e6b359fac4053c8acc2121d 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: Sun, 3 Nov 2024 16:48:17 +0800 Subject: [PATCH] feat: allow disabling certain preset keybinds with the new `noop` virtual command (#1882) --- yazi-config/src/keymap/chord.rs | 4 ++++ yazi-config/src/keymap/keymap.rs | 32 ++++++++++++++++----------- yazi-config/src/open/open.rs | 2 +- yazi-config/src/plugin/plugin.rs | 6 ++--- yazi-config/src/preset.rs | 8 ++++--- yazi-config/src/theme/icons.rs | 10 ++++----- yazi-plugin/preset/plugins/zoxide.lua | 2 +- 7 files changed, 38 insertions(+), 26 deletions(-) diff --git a/yazi-config/src/keymap/chord.rs b/yazi-config/src/keymap/chord.rs index 7cfa995d..596d14b4 100644 --- a/yazi-config/src/keymap/chord.rs +++ b/yazi-config/src/keymap/chord.rs @@ -43,6 +43,10 @@ impl Chord { pub fn desc_or_run(&self) -> Cow { self.desc().unwrap_or_else(|| self.run().into()) } #[inline] + pub fn noop(&self) -> bool { + self.run.len() == 1 && self.run[0].name == "noop" && self.run[0].args.is_empty() + } + pub fn contains(&self, s: &str) -> bool { let s = s.to_lowercase(); self.desc().map(|d| d.to_lowercase().contains(&s)) == Some(true) diff --git a/yazi-config/src/keymap/keymap.rs b/yazi-config/src/keymap/keymap.rs index 7948e968..ede06443 100644 --- a/yazi-config/src/keymap/keymap.rs +++ b/yazi-config/src/keymap/keymap.rs @@ -68,31 +68,37 @@ impl<'de> Deserialize<'de> for Keymap { append_keymap: IndexSet, } - fn mix(mut a: IndexSet, b: IndexSet, c: IndexSet) -> Vec { - let mut seen = HashSet::new(); - b.iter().filter(|&v| v.on.len() > 1).for_each(|v| _ = seen.insert(&v.on[..2])); - c.iter().filter(|&v| v.on.len() > 1).for_each(|v| _ = seen.insert(&v.on[..2])); + fn mix(a: IndexSet, b: IndexSet, c: IndexSet) -> Vec { + let a_seen: HashSet<_> = + a.iter().filter(|&v| v.on.len() > 1).map(|v| [v.on[0], v.on[1]]).collect(); + let b_seen: HashSet<_> = + b.iter().filter(|&v| v.on.len() > 1).map(|v| [v.on[0], v.on[1]]).collect(); - a.retain(|v| v.on.len() < 2 || !seen.contains(&v.on[..2])); - Preset::mix(a, b, c).collect() + Preset::mix( + a, + b.into_iter().filter(|v| v.on.len() < 2 || !a_seen.contains(&v.on[..2])), + c.into_iter().filter(|v| v.on.len() < 2 || !b_seen.contains(&v.on[..2])), + ) + .filter(|c| !c.noop()) + .collect() } let shadow = Shadow::deserialize(deserializer)?; Ok(Self { #[rustfmt::skip] - manager: mix(shadow.manager.keymap, shadow.manager.prepend_keymap, shadow.manager.append_keymap), + manager: mix(shadow.manager.prepend_keymap, shadow.manager.keymap, shadow.manager.append_keymap), #[rustfmt::skip] - tasks: mix(shadow.tasks.keymap, shadow.tasks.prepend_keymap, shadow.tasks.append_keymap), + tasks: mix(shadow.tasks.prepend_keymap, shadow.tasks.keymap, shadow.tasks.append_keymap), #[rustfmt::skip] - pick: mix(shadow.pick.keymap, shadow.pick.prepend_keymap, shadow.pick.append_keymap), + pick: mix(shadow.pick.prepend_keymap, shadow.pick.keymap, shadow.pick.append_keymap), #[rustfmt::skip] - input: mix(shadow.input.keymap, shadow.input.prepend_keymap, shadow.input.append_keymap), + input: mix(shadow.input.prepend_keymap, shadow.input.keymap, shadow.input.append_keymap), #[rustfmt::skip] - confirm: mix(shadow.confirm.keymap, shadow.confirm.prepend_keymap, shadow.confirm.append_keymap), + confirm: mix(shadow.confirm.prepend_keymap, shadow.confirm.keymap, shadow.confirm.append_keymap), #[rustfmt::skip] - help: mix(shadow.help.keymap, shadow.help.prepend_keymap, shadow.help.append_keymap), + help: mix(shadow.help.prepend_keymap, shadow.help.keymap, shadow.help.append_keymap), #[rustfmt::skip] - completion: mix(shadow.completion.keymap, shadow.completion.prepend_keymap, shadow.completion.append_keymap), + completion: mix(shadow.completion.prepend_keymap, shadow.completion.keymap, shadow.completion.append_keymap), }) } } diff --git a/yazi-config/src/open/open.rs b/yazi-config/src/open/open.rs index a9e2d0e6..829a2689 100644 --- a/yazi-config/src/open/open.rs +++ b/yazi-config/src/open/open.rs @@ -99,7 +99,7 @@ impl<'de> Deserialize<'de> for Open { Ok(Self { #[rustfmt::skip] - rules: Preset::mix(outer.open.rules, outer.open.prepend_rules, outer.open.append_rules).collect(), + rules: Preset::mix(outer.open.prepend_rules, outer.open.rules, outer.open.append_rules).collect(), openers, }) } diff --git a/yazi-config/src/plugin/plugin.rs b/yazi-config/src/plugin/plugin.rs index 4cd84eee..245c7e8f 100644 --- a/yazi-config/src/plugin/plugin.rs +++ b/yazi-config/src/plugin/plugin.rs @@ -102,11 +102,11 @@ impl<'de> Deserialize<'de> for Plugin { } shadow.fetchers = - Preset::mix(shadow.fetchers, shadow.prepend_fetchers, shadow.append_fetchers).collect(); + Preset::mix(shadow.prepend_fetchers, shadow.fetchers, shadow.append_fetchers).collect(); shadow.preloaders = - Preset::mix(shadow.preloaders, shadow.prepend_preloaders, shadow.append_preloaders).collect(); + Preset::mix(shadow.prepend_preloaders, shadow.preloaders, shadow.append_preloaders).collect(); shadow.previewers = - Preset::mix(shadow.previewers, shadow.prepend_previewers, shadow.append_previewers).collect(); + Preset::mix(shadow.prepend_previewers, shadow.previewers, shadow.append_previewers).collect(); if shadow.fetchers.len() + shadow.preloaders.len() > MAX_PREWORKERS as usize { panic!("Fetchers and preloaders exceed the limit of {MAX_PREWORKERS}"); diff --git a/yazi-config/src/preset.rs b/yazi-config/src/preset.rs index d52a3bac..e3bb0c5c 100644 --- a/yazi-config/src/preset.rs +++ b/yazi-config/src/preset.rs @@ -33,11 +33,13 @@ impl Preset { } #[inline] - pub(crate) fn mix(a: T, b: T, c: T) -> impl Iterator + pub(crate) fn mix(a: A, b: B, c: C) -> impl Iterator where - T: IntoIterator, + A: IntoIterator, + B: IntoIterator, + C: IntoIterator, { - b.into_iter().chain(a).chain(c) + a.into_iter().chain(b).chain(c) } #[inline] diff --git a/yazi-config/src/theme/icons.rs b/yazi-config/src/theme/icons.rs index 35662da6..edf803fb 100644 --- a/yazi-config/src/theme/icons.rs +++ b/yazi-config/src/theme/icons.rs @@ -132,13 +132,13 @@ impl<'de> Deserialize<'de> for Icons { let shadow = Shadow::deserialize(deserializer)?; - let globs = Preset::mix(shadow.globs, shadow.prepend_globs, shadow.append_globs) + let globs = Preset::mix(shadow.prepend_globs, shadow.globs, shadow.append_globs) .map(|v| { (v.name, Icon { text: v.text, style: Style { fg: v.fg_dark, ..Default::default() } }) }) .collect(); - let conds = Preset::mix(shadow.conds, shadow.prepend_conds, shadow.append_conds) + let conds = Preset::mix(shadow.prepend_conds, shadow.conds, shadow.append_conds) .map(|v| { (v.if_, Icon { text: v.text, style: Style { fg: v.fg_dark, ..Default::default() } }) }) @@ -157,9 +157,9 @@ impl<'de> Deserialize<'de> for Icons { Ok(Self { globs, - dirs: as_map(Preset::mix(shadow.dirs, shadow.prepend_dirs, shadow.append_dirs)), - files: as_map(Preset::mix(shadow.files, shadow.prepend_files, shadow.append_files)), - exts: as_map(Preset::mix(shadow.exts, shadow.prepend_exts, shadow.append_exts)), + dirs: as_map(Preset::mix(shadow.prepend_dirs, shadow.dirs, shadow.append_dirs)), + files: as_map(Preset::mix(shadow.prepend_files, shadow.files, shadow.append_files)), + exts: as_map(Preset::mix(shadow.prepend_exts, shadow.exts, shadow.append_exts)), conds, }) } diff --git a/yazi-plugin/preset/plugins/zoxide.lua b/yazi-plugin/preset/plugins/zoxide.lua index b3687361..785b9081 100644 --- a/yazi-plugin/preset/plugins/zoxide.lua +++ b/yazi-plugin/preset/plugins/zoxide.lua @@ -22,7 +22,7 @@ local function opts() "--keep-right", -- Layout "--layout=reverse", - "--height=50%", + "--height=100%", "--border", "--scrollbar=▌", "--info=inline",