diff --git a/crates/vim/src/motion.rs b/crates/vim/src/motion.rs index de621c547633e3f2ac02f5d3ec47b9582c1ba82a..5aa1df6dd8e2173842cd38fddabd7ddeac0813da 100644 --- a/crates/vim/src/motion.rs +++ b/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; } diff --git a/crates/vim/src/normal.rs b/crates/vim/src/normal.rs index 531f52bf9a7fbce470c96cac274857db2140c050..67b58ac5853203b62d9a4ace99b60cc2ed75b2f8 100644 --- a/crates/vim/src/normal.rs +++ b/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; + } } diff --git a/crates/vim/test_data/test_h_through_unicode.json b/crates/vim/test_data/test_h_through_unicode.json new file mode 100644 index 0000000000000000000000000000000000000000..86d6d0832d3c6f466318b5d56ad9dada6276c0ee --- /dev/null +++ b/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"}] \ No newline at end of file