Clear counts when switching modes

Conrad Irwin created

Change summary

crates/vim/src/test.rs                      | 19 +++++++++++++++++++
crates/vim/src/vim.rs                       |  4 ++++
crates/vim/test_data/test_clear_counts.json |  7 +++++++
3 files changed, 30 insertions(+)

Detailed changes

crates/vim/src/test.rs 🔗

@@ -574,3 +574,22 @@ async fn test_folds(cx: &mut gpui::TestAppContext) {
     "})
         .await;
 }
+
+#[gpui::test]
+async fn test_clear_counts(cx: &mut gpui::TestAppContext) {
+    let mut cx = NeovimBackedTestContext::new(cx).await;
+
+    cx.set_shared_state(indoc! {"
+        The quick brown
+        fox juˇmps over
+        the lazy dog"})
+        .await;
+
+    cx.simulate_shared_keystrokes(["4", "escape", "3", "d", "l"])
+        .await;
+    cx.set_shared_state(indoc! {"
+        The quick brown
+        fox juˇ over
+        the lazy dog"})
+        .await;
+}

crates/vim/src/vim.rs 🔗

@@ -308,6 +308,9 @@ impl Vim {
             state.mode = mode;
             state.operator_stack.clear();
         });
+        if mode != Mode::Insert {
+            self.take_count();
+        }
 
         cx.emit_global(VimEvent::ModeChanged { mode });
 
@@ -412,6 +415,7 @@ impl Vim {
         popped_operator
     }
     fn clear_operator(&mut self, cx: &mut WindowContext) {
+        self.take_count();
         self.update_state(|state| state.operator_stack.clear());
         self.sync_vim_settings(cx);
     }

crates/vim/test_data/test_clear_counts.json 🔗

@@ -0,0 +1,7 @@
+{"Put":{"state":"The quick brown\nfox juˇmps over\nthe lazy dog"}}
+{"Key":"4"}
+{"Key":"escape"}
+{"Key":"3"}
+{"Key":"d"}
+{"Key":"l"}
+{"Put":{"state":"The quick brown\nfox juˇ over\nthe lazy dog"}}