diff --git a/crates/command_palette/src/command_palette.rs b/crates/command_palette/src/command_palette.rs index 90ed7d0d3518aa4f6d49bb4cc18cbf3c275ce7c5..4a80740c3765f25ee878a60fa061c17e3a795b5f 100644 --- a/crates/command_palette/src/command_palette.rs +++ b/crates/command_palette/src/command_palette.rs @@ -43,24 +43,28 @@ pub struct CommandPalette { picker: Entity>, } -/// Removes subsequent whitespace characters and double colons from the query. +/// Removes subsequent whitespace characters and double colons from the query, and converts +/// underscores to spaces. /// /// This improves the likelihood of a match by either humanized name or keymap-style name. +/// Underscores are converted to spaces because `humanize_action_name` converts them to spaces +/// when building the search candidates (e.g. `terminal_panel::Toggle` -> `terminal panel: toggle`). pub fn normalize_action_query(input: &str) -> String { let mut result = String::with_capacity(input.len()); let mut last_char = None; for char in input.trim().chars() { - match (last_char, char) { + let normalized_char = if char == '_' { ' ' } else { char }; + match (last_char, normalized_char) { (Some(':'), ':') => continue, - (Some(last_char), char) if last_char.is_whitespace() && char.is_whitespace() => { + (Some(last_char), c) if last_char.is_whitespace() && c.is_whitespace() => { continue; } _ => { - last_char = Some(char); + last_char = Some(normalized_char); } } - result.push(char); + result.push(normalized_char); } result @@ -775,6 +779,14 @@ mod tests { normalize_action_query("editor: :GoToDefinition"), "editor: :GoToDefinition" ); + assert_eq!( + normalize_action_query("terminal_panel::Toggle"), + "terminal panel:Toggle" + ); + assert_eq!( + normalize_action_query("project_panel::ToggleFocus"), + "project panel:ToggleFocus" + ); } #[gpui::test]