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"}}