vim: indent/outdent (#2644)

Nathan Sobo created

Release Notes:

- vim: support indent/outdent
([#832](https://github.com/zed-industries/community/issues/832>)).

Change summary

assets/keymaps/vim.json |  8 ++++++--
crates/vim/src/test.rs  | 16 ++++++++++++++++
2 files changed, 22 insertions(+), 2 deletions(-)

Detailed changes

assets/keymaps/vim.json 🔗

@@ -207,6 +207,8 @@
         "Replace"
       ],
       "s": "vim::Substitute",
+      "> >": "editor::Indent",
+      "< <": "editor::Outdent",
       "ctrl-pagedown": "pane::ActivateNextItem",
       "ctrl-pageup": "pane::ActivatePrevItem"
     }
@@ -302,7 +304,9 @@
       "r": [
         "vim::PushOperator",
         "Replace"
-      ]
+      ],
+      "> >": "editor::Indent",
+      "< <": "editor::Outdent"
     }
   },
   {
@@ -320,4 +324,4 @@
       "escape": "editor::Cancel"
     }
   }
-]
+]

crates/vim/src/test.rs 🔗

@@ -123,3 +123,19 @@ async fn test_end_of_document_710(cx: &mut gpui::TestAppContext) {
     cx.simulate_keystrokes(["1", "shift-g"]);
     cx.assert_editor_state("aˇa\nbb\ncc");
 }
+
+#[gpui::test]
+async fn test_indent_outdent(cx: &mut gpui::TestAppContext) {
+    let mut cx = VimTestContext::new(cx, true).await;
+
+    // works in normal mode
+    cx.set_state(indoc! {"aa\nbˇb\ncc"}, Mode::Normal);
+    cx.simulate_keystrokes([">", ">"]);
+    cx.assert_editor_state("aa\n    bˇb\ncc");
+    cx.simulate_keystrokes(["<", "<"]);
+    cx.assert_editor_state("aa\nbˇb\ncc");
+
+    // works in visuial mode
+    cx.simulate_keystrokes(["shift-v", "down", ">", ">"]);
+    cx.assert_editor_state("aa\n    b«b\n    cˇ»c");
+}