Clear SelectionGoal on input (#3089)

Conrad Irwin created

Release Notes:

- `up` and `down` now go to the correct place after inserting

Change summary

crates/editor/src/editor.rs                   |  8 +++++++-
crates/vim/src/test.rs                        | 17 +++++++++++++++++
crates/vim/test_data/test_selection_goal.json |  8 ++++++++
3 files changed, 32 insertions(+), 1 deletion(-)

Detailed changes

crates/editor/src/editor.rs 🔗

@@ -2454,7 +2454,13 @@ impl Editor {
             let snapshot = this.buffer.read(cx).read(cx);
             let new_selections = resolve_multiple::<usize, _>(new_anchor_selections, &snapshot)
                 .zip(new_selection_deltas)
-                .map(|(selection, delta)| selection.map(|e| e + delta))
+                .map(|(selection, delta)| Selection {
+                    id: selection.id,
+                    start: selection.start + delta,
+                    end: selection.end + delta,
+                    reversed: selection.reversed,
+                    goal: SelectionGoal::None,
+                })
                 .collect::<Vec<_>>();
 
             let mut i = 0;

crates/vim/src/test.rs 🔗

@@ -635,3 +635,20 @@ async fn test_zero(cx: &mut gpui::TestAppContext) {
         the lazy dog"})
         .await;
 }
+
+#[gpui::test]
+async fn test_selection_goal(cx: &mut gpui::TestAppContext) {
+    let mut cx = NeovimBackedTestContext::new(cx).await;
+
+    cx.set_shared_state(indoc! {"
+        ;;ˇ;
+        Lorem Ipsum"})
+        .await;
+
+    cx.simulate_shared_keystrokes(["a", "down", "up", ";", "down", "up"])
+        .await;
+    cx.assert_shared_state(indoc! {"
+        ;;;;ˇ
+        Lorem Ipsum"})
+        .await;
+}

crates/vim/test_data/test_selection_goal.json 🔗

@@ -0,0 +1,8 @@
+{"Put":{"state":";;ˇ;\nLorem Ipsum"}}
+{"Key":"a"}
+{"Key":"down"}
+{"Key":"up"}
+{"Key":";"}
+{"Key":"down"}
+{"Key":"up"}
+{"Get":{"state":";;;;ˇ\nLorem Ipsum","mode":"Insert"}}