diff --git a/crates/settings_ui/src/keybindings.rs b/crates/settings_ui/src/keybindings.rs index 4adac417bf..480614bcab 100644 --- a/crates/settings_ui/src/keybindings.rs +++ b/crates/settings_ui/src/keybindings.rs @@ -190,13 +190,13 @@ impl KeymapEditor { this: WeakEntity, query: String, cx: &mut AsyncApp, - ) -> Result<(), db::anyhow::Error> { + ) -> anyhow::Result<()> { let query = command_palette::normalize_action_query(&query); let (string_match_candidates, keybind_count) = this.read_with(cx, |this, _| { (this.string_match_candidates.clone(), this.keybindings.len()) })?; let executor = cx.background_executor().clone(); - let matches = fuzzy::match_strings( + let mut matches = fuzzy::match_strings( &string_match_candidates, &query, true, @@ -207,6 +207,23 @@ impl KeymapEditor { ) .await; this.update(cx, |this, cx| { + if query.is_empty() { + // apply default sort + // sorts by source precedence, and alphabetically by action name within each source + matches.sort_by_key(|match_item| { + let keybind = &this.keybindings[match_item.candidate_id]; + let source = keybind.source.as_ref().map(|s| s.0); + use KeybindSource::*; + let source_precedence = match source { + Some(User) => 0, + Some(Vim) => 1, + Some(Base) => 2, + Some(Default) => 3, + None => 4, + }; + return (source_precedence, keybind.action.as_ref()); + }); + } this.selected_index.take(); this.scroll_to_item(0, ScrollStrategy::Top, cx); this.matches = matches; @@ -216,7 +233,7 @@ impl KeymapEditor { fn process_bindings( json_language: Arc, - cx: &mut Context, + cx: &mut App, ) -> (Vec, Vec) { let key_bindings_ptr = cx.key_bindings(); let lock = key_bindings_ptr.borrow(); @@ -246,7 +263,7 @@ impl KeymapEditor { unmapped_action_names.remove(&action_name); let action_input = key_binding .action_input() - .map(|input| TextWithSyntaxHighlighting::new(input, json_language.clone())); + .map(|input| SyntaxHighlightedText::new(input, json_language.clone())); let index = processed_bindings.len(); let string_match_candidate = StringMatchCandidate::new(index, &action_name); @@ -283,6 +300,7 @@ impl KeymapEditor { let workspace = self.workspace.clone(); cx.spawn(async move |this, cx| { let json_language = Self::load_json_language(workspace, cx).await; + let query = this.update(cx, |this, cx| { let (key_bindings, string_match_candidates) = Self::process_bindings(json_language.clone(), cx); @@ -502,7 +520,7 @@ struct ProcessedKeybinding { keystroke_text: SharedString, ui_key_binding: Option, action: SharedString, - action_input: Option, + action_input: Option, context: Option, source: Option<(KeybindSource, SharedString)>, } @@ -671,12 +689,12 @@ impl Render for KeymapEditor { } #[derive(Debug, Clone, IntoElement)] -struct TextWithSyntaxHighlighting { +struct SyntaxHighlightedText { text: SharedString, language: Arc, } -impl TextWithSyntaxHighlighting { +impl SyntaxHighlightedText { pub fn new(text: impl Into, language: Arc) -> Self { Self { text: text.into(), @@ -685,7 +703,7 @@ impl TextWithSyntaxHighlighting { } } -impl RenderOnce for TextWithSyntaxHighlighting { +impl RenderOnce for SyntaxHighlightedText { fn render(self, window: &mut Window, cx: &mut App) -> impl IntoElement { let text_style = window.text_style(); let syntax_theme = cx.theme().syntax();