From cfc3b7de05323955a7737d17a36bebade81eb76c Mon Sep 17 00:00:00 2001 From: fletcher gornick Date: Tue, 27 Aug 2024 19:50:19 -0500 Subject: [PATCH] vim: Retain search direction upon search submit (#16754) Before, when using `?` and `#` for backwards search it would initially search for the previous match, but upon subsequent inputs to `n` and `N`, `n` is always treated as "forward" and `N` is always treated as "backward", instead of continuing the search direction. now, if i use `?` or `#` for backward search, `n` will go to the previous selection, and `N` will go to the next. Functionality stays the same for `/` and `*`. Release Notes: - vim: Fixed `n` direction after searching backwards --------- Co-authored-by: Conrad Irwin --- crates/vim/src/normal/search.rs | 19 +++++++++++++++++-- crates/vim/test_data/test_backwards_n.json | 8 ++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 crates/vim/test_data/test_backwards_n.json diff --git a/crates/vim/src/normal/search.rs b/crates/vim/src/normal/search.rs index c417372f87..b9cd53217c 100644 --- a/crates/vim/src/normal/search.rs +++ b/crates/vim/src/normal/search.rs @@ -81,11 +81,11 @@ impl Vim { } fn move_to_next_match(&mut self, _: &MoveToNextMatch, cx: &mut ViewContext) { - self.move_to_match_internal(Direction::Next, cx) + self.move_to_match_internal(self.search.direction, cx) } fn move_to_prev_match(&mut self, _: &MoveToPrevMatch, cx: &mut ViewContext) { - self.move_to_match_internal(Direction::Prev, cx) + self.move_to_match_internal(self.search.direction.opposite(), cx) } fn search(&mut self, action: &Search, cx: &mut ViewContext) { @@ -236,6 +236,7 @@ impl Vim { let vim = cx.view().clone(); let searched = pane.update(cx, |pane, cx| { + self.search.direction = direction; let Some(search_bar) = pane.toolbar().read(cx).item_of_type::() else { return false; }; @@ -705,6 +706,20 @@ mod test { cx.shared_state().await.assert_eq("ˇcd a.c. abcd"); } + #[gpui::test] + async fn test_backwards_n(cx: &mut gpui::TestAppContext) { + let mut cx = NeovimBackedTestContext::new(cx).await; + + cx.set_shared_state("ˇa b a b a b a").await; + cx.simulate_shared_keystrokes("*").await; + cx.simulate_shared_keystrokes("n").await; + cx.shared_state().await.assert_eq("a b a b ˇa b a"); + cx.simulate_shared_keystrokes("#").await; + cx.shared_state().await.assert_eq("a b ˇa b a b a"); + cx.simulate_shared_keystrokes("n").await; + cx.shared_state().await.assert_eq("ˇa b a b a b a"); + } + #[gpui::test] async fn test_v_search(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; diff --git a/crates/vim/test_data/test_backwards_n.json b/crates/vim/test_data/test_backwards_n.json new file mode 100644 index 0000000000..a08cc84d21 --- /dev/null +++ b/crates/vim/test_data/test_backwards_n.json @@ -0,0 +1,8 @@ +{"Put":{"state":"ˇa b a b a b a"}} +{"Key":"*"} +{"Key":"n"} +{"Get":{"state":"a b a b ˇa b a","mode":"Normal"}} +{"Key":"#"} +{"Get":{"state":"a b ˇa b a b a","mode":"Normal"}} +{"Key":"n"} +{"Get":{"state":"ˇa b a b a b a","mode":"Normal"}}