Addresses issue where left motion in vim mode would clip in the wrong direction

Kay Simmons created

Change summary

crates/vim/src/motion.rs                         | 2 +-
crates/vim/src/normal.rs                         | 6 ++++++
crates/vim/test_data/test_h_through_unicode.json | 1 +
3 files changed, 8 insertions(+), 1 deletion(-)

Detailed changes

crates/vim/src/motion.rs 🔗

@@ -266,7 +266,7 @@ impl Motion {
 fn left(map: &DisplaySnapshot, mut point: DisplayPoint, times: usize) -> DisplayPoint {
     for _ in 0..times {
         *point.column_mut() = point.column().saturating_sub(1);
-        point = map.clip_point(point, Bias::Right);
+        point = map.clip_point(point, Bias::Left);
         if point.column() == 0 {
             break;
         }

crates/vim/src/normal.rs 🔗

@@ -851,4 +851,10 @@ mod test {
             .await;
         }
     }
+
+    #[gpui::test]
+    async fn test_h_through_unicode(cx: &mut gpui::TestAppContext) {
+        let mut cx = NeovimBackedTestContext::new(cx).await.binding(["h"]);
+        cx.assert_all("Testˇ├ˇ──ˇ┐ˇTest").await;
+    }
 }

crates/vim/test_data/test_h_through_unicode.json 🔗

@@ -0,0 +1 @@
+[{"Text":"Test├──┐Test"},{"Mode":"Normal"},{"Selection":{"start":[0,3],"end":[0,3]}},{"Mode":"Normal"},{"Text":"Test├──┐Test"},{"Mode":"Normal"},{"Selection":{"start":[0,4],"end":[0,4]}},{"Mode":"Normal"},{"Text":"Test├──┐Test"},{"Mode":"Normal"},{"Selection":{"start":[0,10],"end":[0,10]}},{"Mode":"Normal"},{"Text":"Test├──┐Test"},{"Mode":"Normal"},{"Selection":{"start":[0,13],"end":[0,13]}},{"Mode":"Normal"}]