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

close: #11981 

Release Notes:

- N/A

---------

Co-authored-by: Conrad Irwin <conrad.irwin@gmail.com>
This commit is contained in:
CharlesChen0823 2024-05-21 09:17:11 +08:00 committed by GitHub
parent f2357c71e1
commit 1e18bcb949
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 25 additions and 4 deletions

View File

@ -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>],

View File

@ -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
"
});
}
}

View File

@ -10,3 +10,7 @@
{"Key":"b"}
{"Key":"enter"}
{"Get":{"state":"a\nb\nb\nb\nˇb\na\na\n ","mode":"Normal"}}
{"Key":"/"}
{"Key":"a"}
{"Key":"enter"}
{"Get":{"state":"a\nb\nb\nb\nb\nˇa\na\n ","mode":"Normal"}}