From 3cbac271171c0c456befafcce21cc24631afb3b0 Mon Sep 17 00:00:00 2001 From: Gus Date: Tue, 14 May 2024 19:57:58 -0700 Subject: [PATCH] Show buffer_search on vim::MoveToNextMatch (#11836) This changes the vim::MoveToNextMatch event callback to open the buffer_search toolbar. This fixes an issue where highlights would appear which were only cancellable by opening then closing the toolbar. Release Notes: - the buffer search toolbar now opens on vim::MoveToNextMatch fixing the issue where highlights were not cancellable --------- Co-authored-by: Conrad Irwin --- crates/search/src/buffer_search.rs | 4 ++++ crates/vim/src/normal/search.rs | 3 +++ crates/vim/src/visual.rs | 3 +++ 3 files changed, 10 insertions(+) diff --git a/crates/search/src/buffer_search.rs b/crates/search/src/buffer_search.rs index 1c1f1e974a..66f473d829 100644 --- a/crates/search/src/buffer_search.rs +++ b/crates/search/src/buffer_search.rs @@ -840,6 +840,10 @@ impl BufferSearchBar { } } + pub fn has_active_match(&self) -> bool { + self.active_match_index.is_some() + } + fn clear_matches(&mut self, cx: &mut ViewContext) { let mut active_item_matches = None; for (searchable_item, matches) in self.searchable_items_with_matches.drain() { diff --git a/crates/vim/src/normal/search.rs b/crates/vim/src/normal/search.rs index d7277a52ef..cc783e6120 100644 --- a/crates/vim/src/normal/search.rs +++ b/crates/vim/src/normal/search.rs @@ -218,6 +218,9 @@ pub fn move_to_match_internal( pane.update(cx, |pane, cx| { if let Some(search_bar) = pane.toolbar().read(cx).item_of_type::() { search_bar.update(cx, |search_bar, cx| { + if !search_bar.has_active_match() || !search_bar.show(cx) { + return; + } search_bar.select_match(direction, count, cx); let new_selections = vim.editor_selections(cx); diff --git a/crates/vim/src/visual.rs b/crates/vim/src/visual.rs index 9e9a8b4474..51161a6bf8 100644 --- a/crates/vim/src/visual.rs +++ b/crates/vim/src/visual.rs @@ -516,6 +516,9 @@ pub fn select_match( pane.update(cx, |pane, cx| { if let Some(search_bar) = pane.toolbar().read(cx).item_of_type::() { search_bar.update(cx, |search_bar, cx| { + if !search_bar.has_active_match() || !search_bar.show(cx) { + return; + } // without update_match_index there is a bug when the cursor is before the first match search_bar.update_match_index(cx); search_bar.select_match(direction.opposite(), 1, cx);