vim: Fix %s replace not working more than twice (#12045)

CharlesChen0823 and Conrad Irwin created

close: #11981 

Release Notes:

- N/A

---------

Co-authored-by: Conrad Irwin <conrad.irwin@gmail.com>

Change summary

crates/editor/src/editor.rs                       |  4 +++
crates/vim/src/normal/search.rs                   | 21 +++++++++++++---
crates/vim/test_data/test_replace_with_range.json |  4 +++
3 files changed, 25 insertions(+), 4 deletions(-)

Detailed changes

crates/editor/src/editor.rs šŸ”—

@@ -9983,6 +9983,10 @@ impl Editor {
         )
     }
 
+    pub fn clear_search_within_ranges(&mut self, cx: &mut ViewContext<Self>) {
+        self.clear_background_highlights::<SearchWithinRange>(cx);
+    }
+
     pub fn highlight_background<T: 'static>(
         &mut self,
         ranges: &[Range<Anchor>],

crates/vim/src/normal/search.rs šŸ”—

@@ -353,7 +353,6 @@ fn replace_command(
                 let range = snapshot
                     .anchor_before(Point::new(range.start.saturating_sub(1) as u32, 0))
                     ..snapshot.anchor_before(Point::new(range.end as u32, 0));
-
                 editor.set_search_within_ranges(&[range], cx)
             })
         }
@@ -394,9 +393,7 @@ fn replace_command(
                                 .timer(Duration::from_millis(200))
                                 .await;
                             editor
-                                .update(&mut cx, |editor, cx| {
-                                    editor.set_search_within_ranges(&[], cx)
-                                })
+                                .update(&mut cx, |editor, cx| editor.clear_search_within_ranges(cx))
                                 .ok();
                         })
                         .detach();
@@ -512,6 +509,8 @@ fn parse_replace_all(query: &str) -> Replacement {
 
 #[cfg(test)]
 mod test {
+    use std::time::Duration;
+
     use editor::{display_map::DisplayRow, DisplayPoint};
     use indoc::indoc;
     use search::BufferSearchBar;
@@ -744,5 +743,19 @@ mod test {
             a
              "
         });
+        cx.executor().advance_clock(Duration::from_millis(250));
+        cx.run_until_parked();
+
+        cx.simulate_shared_keystrokes("/ a enter").await;
+        cx.shared_state().await.assert_eq(indoc! {
+            "a
+                b
+                b
+                b
+                b
+                ˇa
+                a
+                 "
+        });
     }
 }