diff --git a/crates/vim/src/editor_events.rs b/crates/vim/src/editor_events.rs index e405779279..e325c529a7 100644 --- a/crates/vim/src/editor_events.rs +++ b/crates/vim/src/editor_events.rs @@ -1,6 +1,6 @@ -use crate::Vim; +use crate::{insert::NormalBefore, Vim}; use editor::{Editor, EditorEvent}; -use gpui::{AppContext, Entity, EntityId, View, ViewContext, WindowContext}; +use gpui::{Action, AppContext, Entity, EntityId, View, ViewContext, WindowContext}; pub fn init(cx: &mut AppContext) { cx.observe_new_views(|_, cx: &mut ViewContext| { @@ -34,8 +34,7 @@ fn focused(editor: View, cx: &mut WindowContext) { fn blurred(editor: View, cx: &mut WindowContext) { Vim::update(cx, |vim, cx| { - vim.workspace_state.recording = false; - vim.workspace_state.recorded_actions.clear(); + vim.stop_recording_immediately(NormalBefore.boxed_clone()); if let Some(previous_editor) = vim.active_editor.clone() { if previous_editor .upgrade() diff --git a/crates/vim/src/normal/repeat.rs b/crates/vim/src/normal/repeat.rs index a2587c6f00..796cfce7a3 100644 --- a/crates/vim/src/normal/repeat.rs +++ b/crates/vim/src/normal/repeat.rs @@ -493,4 +493,17 @@ mod test { cx.simulate_keystrokes(["escape"]); cx.assert_state("ˇjhello\n", Mode::Normal); } + + #[gpui::test] + async fn test_repeat_over_blur(cx: &mut gpui::TestAppContext) { + let mut cx = NeovimBackedTestContext::new(cx).await; + + cx.set_shared_state("ˇhello hello hello\n").await; + cx.simulate_shared_keystrokes(["c", "f", "o", "x", "escape"]) + .await; + cx.assert_shared_state("ˇx hello hello\n").await; + cx.simulate_shared_keystrokes([":", "escape"]).await; + cx.simulate_shared_keystrokes(["."]).await; + cx.assert_shared_state("ˇx hello\n").await; + } } diff --git a/crates/vim/src/test/neovim_backed_test_context.rs b/crates/vim/src/test/neovim_backed_test_context.rs index fe5c5db62f..384722286c 100644 --- a/crates/vim/src/test/neovim_backed_test_context.rs +++ b/crates/vim/src/test/neovim_backed_test_context.rs @@ -62,6 +62,8 @@ pub struct NeovimBackedTestContext { impl NeovimBackedTestContext { pub async fn new(cx: &mut gpui::TestAppContext) -> NeovimBackedTestContext { + #[cfg(feature = "neovim")] + cx.executor().allow_parking(); // rust stores the name of the test on the current thread. // We use this to automatically name a file that will store // the neovim connection's requests/responses so that we can diff --git a/crates/vim/test_data/test_repeat_over_blur.json b/crates/vim/test_data/test_repeat_over_blur.json new file mode 100644 index 0000000000..3929711e49 --- /dev/null +++ b/crates/vim/test_data/test_repeat_over_blur.json @@ -0,0 +1,11 @@ +{"Put":{"state":"ˇhello hello hello\n"}} +{"Key":"c"} +{"Key":"f"} +{"Key":"o"} +{"Key":"x"} +{"Key":"escape"} +{"Get":{"state":"ˇx hello hello\n","mode":"Normal"}} +{"Key":":"} +{"Key":"escape"} +{"Key":"."} +{"Get":{"state":"ˇx hello\n","mode":"Normal"}}