From d41a42302c2df1057877c65189d88ffce8814edd Mon Sep 17 00:00:00 2001 From: Alastair Scheuermann Date: Tue, 23 Jun 2026 14:15:45 -0600 Subject: [PATCH] fix(help): search keybindings by key name in command palette base cases covered for exact searching `on` command keys, case-insensitive prefixes, and substring matches on key name or description. --- yazi-core/src/help/help.rs | 48 +++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/yazi-core/src/help/help.rs b/yazi-core/src/help/help.rs index fd5472fb..0f7b8111 100644 --- a/yazi-core/src/help/help.rs +++ b/yazi-core/src/help/help.rs @@ -43,12 +43,48 @@ impl Help { } else if self.keyword != kw { let lowercased = kw.to_lowercase(); self.keyword = kw.to_owned(); - self.bindings = KEYMAP - .chords(self.layer) - .iter() - .filter(|&c| c.desc_or_run().to_lowercase().contains(&lowercased)) - .cloned() - .collect(); + + let exact_prefix = |on: &str| on.starts_with(kw); + let icase_prefix = |on: &str| on.to_lowercase().starts_with(&lowercased); + + let all = KEYMAP.chords(self.layer); + // Priority 1: exact case-sensitive prefix (`y` -> `y`; ` ``) + let mut bindings: Vec = + all.iter().filter(|c| exact_prefix(&c.on())).cloned().collect(); + // Priority 2: case-insensitive prefix not in group 1 (`y` -> `Y`; ` ` ``, ``) + let on_contains = |on: &str| on.to_lowercase().contains(&lowercased); + bindings.extend( + all + .iter() + .filter(|c| { + let on = c.on(); + !icase_prefix(&on) && on_contains(&on) + }) + .cloned(), + ); + // Priority 4: desc-only match (`enter` -> `l` "Enter the child directory") + bindings.extend( + all + .iter() + .filter(|c| { + let on = c.on(); + !icase_prefix(&on) + && !on_contains(&on) + && c.desc_or_run().to_lowercase().contains(&lowercased) + }) + .cloned(), + ); + self.bindings = bindings; } render!(self.scroll(0));