diff --git a/crates/vim/src/motion.rs b/crates/vim/src/motion.rs index c99901e2fa..ed8640ecbc 100644 --- a/crates/vim/src/motion.rs +++ b/crates/vim/src/motion.rs @@ -890,7 +890,7 @@ impl Motion { } if inclusive && selection.end.column() < map.line_len(selection.end.row()) { - *selection.end.column_mut() += 1; + selection.end = movement::saturating_right(map, selection.end) } } Some(selection.start..selection.end) diff --git a/crates/vim/src/test.rs b/crates/vim/src/test.rs index 7c59d5541a..b40a5cd9ac 100644 --- a/crates/vim/src/test.rs +++ b/crates/vim/src/test.rs @@ -1266,3 +1266,16 @@ async fn test_toggle_comments(cx: &mut gpui::TestAppContext) { Mode::Normal, ); } + +#[gpui::test] +async fn test_find_multibyte(cx: &mut gpui::TestAppContext) { + let mut cx = NeovimBackedTestContext::new(cx).await; + + cx.set_shared_state(r#""#) + .await; + + cx.simulate_shared_keystrokes("c t < o escape").await; + cx.shared_state() + .await + .assert_eq(r#""#); +} diff --git a/crates/vim/test_data/test_find_multibyte.json b/crates/vim/test_data/test_find_multibyte.json new file mode 100644 index 0000000000..710a89aede --- /dev/null +++ b/crates/vim/test_data/test_find_multibyte.json @@ -0,0 +1,7 @@ +{"Put":{"state":""}} +{"Key":"c"} +{"Key":"t"} +{"Key":"<"} +{"Key":"o"} +{"Key":"escape"} +{"Get":{"state":"","mode":"Normal"}}