clip FoldPoint earlier (#2982)

Conrad Irwin created

fold_point_to_display_point calls to_offset on the fold point, which
panics if it hasn't been clipped.

https://zed-industries.slack.com/archives/C04S6T1T7TQ/p1694850156370919

Release Notes:

- vim: Fix a crash when moving up/down in some circumstances.

Change summary

crates/vim/src/motion.rs | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)

Detailed changes

crates/vim/src/motion.rs 🔗

@@ -536,8 +536,12 @@ fn down(
         map.buffer_snapshot.max_point().row,
     );
     let new_col = cmp::min(goal_column, map.fold_snapshot.line_len(new_row));
-    let point = map.fold_point_to_display_point(FoldPoint::new(new_row, new_col));
+    let point = map.fold_point_to_display_point(
+        map.fold_snapshot
+            .clip_point(FoldPoint::new(new_row, new_col), Bias::Left),
+    );
 
+    // clip twice to "clip at end of line"
     (map.clip_point(point, Bias::Left), goal)
 }
 
@@ -573,7 +577,10 @@ pub(crate) fn up(
 
     let new_row = start.row().saturating_sub(times as u32);
     let new_col = cmp::min(goal_column, map.fold_snapshot.line_len(new_row));
-    let point = map.fold_point_to_display_point(FoldPoint::new(new_row, new_col));
+    let point = map.fold_point_to_display_point(
+        map.fold_snapshot
+            .clip_point(FoldPoint::new(new_row, new_col), Bias::Left),
+    );
 
     (map.clip_point(point, Bias::Left), goal)
 }