Add Helix implementation for `Motion::FindForward` and `Motion::FindBackward` (#31547)

thebasilisk created

Closes #30462 

Release Notes:

- Added text selection for "vim::PushFindForward" and
"vim::PushFindBackward" keybinds in helix mode

Change summary

crates/vim/src/helix.rs | 54 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 54 insertions(+)

Detailed changes

crates/vim/src/helix.rs 🔗

@@ -235,6 +235,60 @@ impl Vim {
                     found
                 })
             }
+            Motion::FindForward { .. } => {
+                self.update_editor(window, cx, |_, editor, window, cx| {
+                    let text_layout_details = editor.text_layout_details(window);
+                    editor.change_selections(Some(Autoscroll::fit()), window, cx, |s| {
+                        s.move_with(|map, selection| {
+                            let goal = selection.goal;
+                            let cursor = if selection.is_empty() || selection.reversed {
+                                selection.head()
+                            } else {
+                                movement::left(map, selection.head())
+                            };
+
+                            let (point, goal) = motion
+                                .move_point(
+                                    map,
+                                    cursor,
+                                    selection.goal,
+                                    times,
+                                    &text_layout_details,
+                                )
+                                .unwrap_or((cursor, goal));
+                            selection.set_tail(selection.head(), goal);
+                            selection.set_head(movement::right(map, point), goal);
+                        })
+                    });
+                });
+            }
+            Motion::FindBackward { .. } => {
+                self.update_editor(window, cx, |_, editor, window, cx| {
+                    let text_layout_details = editor.text_layout_details(window);
+                    editor.change_selections(Some(Autoscroll::fit()), window, cx, |s| {
+                        s.move_with(|map, selection| {
+                            let goal = selection.goal;
+                            let cursor = if selection.is_empty() || selection.reversed {
+                                selection.head()
+                            } else {
+                                movement::left(map, selection.head())
+                            };
+
+                            let (point, goal) = motion
+                                .move_point(
+                                    map,
+                                    cursor,
+                                    selection.goal,
+                                    times,
+                                    &text_layout_details,
+                                )
+                                .unwrap_or((cursor, goal));
+                            selection.set_tail(selection.head(), goal);
+                            selection.set_head(point, goal);
+                        })
+                    });
+                });
+            }
             _ => self.helix_move_and_collapse(motion, times, window, cx),
         }
     }