diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index 31563010b7..ab88a39a9a 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -1248,7 +1248,7 @@ impl MutableAppContext { self.keystroke_matcher .bindings_for_action_type(action.as_any().type_id()) .find_map(|b| { - if b.match_context(&contexts) { + if b.match_dispatch_path_context(&contexts) { Some(b.keystrokes().into()) } else { None @@ -1283,7 +1283,7 @@ impl MutableAppContext { deserialize("{}").ok()?, self.keystroke_matcher .bindings_for_action_type(*type_id) - .filter(|b| b.match_context(&contexts)) + .filter(|b| b.match_dispatch_path_context(&contexts)) .collect(), )) } else { diff --git a/crates/gpui/src/keymap_matcher/binding.rs b/crates/gpui/src/keymap_matcher/binding.rs index c1cfd14e82..1b0217b5ff 100644 --- a/crates/gpui/src/keymap_matcher/binding.rs +++ b/crates/gpui/src/keymap_matcher/binding.rs @@ -42,6 +42,15 @@ impl Binding { .unwrap_or(true) } + pub fn match_dispatch_path_context(&self, contexts: &[KeymapContext]) -> bool { + for i in 0..contexts.len() { + if self.match_context(&contexts[i..]) { + return true; + } + } + false + } + pub fn match_keys_and_context( &self, pending_keystrokes: &Vec, diff --git a/crates/gpui/src/keymap_matcher/keymap_context.rs b/crates/gpui/src/keymap_matcher/keymap_context.rs index fbaaa5fbc5..bbf6bfc14b 100644 --- a/crates/gpui/src/keymap_matcher/keymap_context.rs +++ b/crates/gpui/src/keymap_matcher/keymap_context.rs @@ -64,13 +64,7 @@ impl KeymapContextPredicate { pub fn eval(&self, contexts: &[KeymapContext]) -> bool { let Some(context) = contexts.first() else { return false }; match self { - Self::Identifier(name) => { - if (&context.set).contains(name.as_str()) { - true - } else { - self.eval(&contexts[1..]) - } - } + Self::Identifier(name) => (&context.set).contains(name.as_str()), Self::Equal(left, right) => context .map .get(left.as_str())