Add counts to subsitute (and all)

Conrad Irwin and Nathan Sobo created

Co-Authored-By: Nathan Sobo <nathan@zed.dev>

Change summary

assets/keymaps/vim.json  | 2 +-
crates/vim/src/normal.rs | 2 +-
crates/vim/src/test.rs   | 4 ++++
3 files changed, 6 insertions(+), 2 deletions(-)

Detailed changes

assets/keymaps/vim.json 🔗

@@ -131,7 +131,7 @@
     }
   },
   {
-    "context": "Editor && vim_mode == normal && vim_operator == none && !VimWaiting",
+    "context": "Editor && vim_mode == normal && (vim_operator == none || vim_operator == n) && !VimWaiting",
     "bindings": {
       "c": [
         "vim::PushOperator",

crates/vim/src/normal.rs 🔗

@@ -484,7 +484,7 @@ pub fn substitute(vim: &mut Vim, count: usize, cx: &mut WindowContext) {
             let selections = editor.selections.all::<Point>(cx);
             for selection in selections.into_iter().rev() {
                 let end = if selection.start == selection.end {
-                    selection.start + Point::new(0, 1)
+                    selection.start + Point::new(0, count as u32)
                 } else {
                     selection.end
                 };

crates/vim/src/test.rs 🔗

@@ -117,4 +117,8 @@ async fn test_substitute(cx: &mut gpui::TestAppContext) {
     cx.set_state(indoc! {"a«bcˇ»deˇfg\n"}, Mode::Normal);
     cx.simulate_keystrokes(["s", "x"]);
     cx.assert_editor_state("axˇdexˇg\n");
+
+    cx.set_state(indoc! {"ˇabc\n"}, Mode::Normal);
+    cx.simulate_keystrokes(["2", "s", "x"]);
+    cx.assert_editor_state("xˇc\n");
 }