tweak editor selection mutating functions

Keith Simmons created

Change summary

crates/editor/src/editor.rs     |  8 ++++----
crates/vim/src/normal/delete.rs | 16 +++++++++-------
2 files changed, 13 insertions(+), 11 deletions(-)

Detailed changes

crates/editor/src/editor.rs 🔗

@@ -1316,7 +1316,7 @@ impl Editor {
     pub fn replace_selections_with(
         &mut self,
         cx: &mut ViewContext<Self>,
-        find_replacement: impl Fn(&DisplaySnapshot) -> DisplayPoint,
+        mut find_replacement: impl FnMut(&DisplaySnapshot) -> DisplayPoint,
     ) {
         let display_map = self.snapshot(cx);
         let cursor = find_replacement(&display_map);
@@ -1334,7 +1334,7 @@ impl Editor {
     pub fn move_selections(
         &mut self,
         cx: &mut ViewContext<Self>,
-        move_selection: impl Fn(&DisplaySnapshot, &mut Selection<DisplayPoint>),
+        mut move_selection: impl FnMut(&DisplaySnapshot, &mut Selection<DisplayPoint>),
     ) {
         let display_map = self.display_map.update(cx, |map, cx| map.snapshot(cx));
         let selections = self
@@ -1352,7 +1352,7 @@ impl Editor {
     pub fn move_selection_heads(
         &mut self,
         cx: &mut ViewContext<Self>,
-        update_head: impl Fn(
+        mut update_head: impl FnMut(
             &DisplaySnapshot,
             DisplayPoint,
             SelectionGoal,
@@ -1367,7 +1367,7 @@ impl Editor {
     pub fn move_cursors(
         &mut self,
         cx: &mut ViewContext<Self>,
-        update_cursor_position: impl Fn(
+        mut update_cursor_position: impl FnMut(
             &DisplaySnapshot,
             DisplayPoint,
             SelectionGoal,

crates/vim/src/normal/delete.rs 🔗

@@ -1,29 +1,31 @@
 use crate::{motion::Motion, Vim};
+use collections::HashMap;
 use editor::Bias;
 use gpui::MutableAppContext;
-use language::SelectionGoal;
 
 pub fn delete_over(vim: &mut Vim, motion: Motion, cx: &mut MutableAppContext) {
     vim.update_active_editor(cx, |editor, cx| {
         editor.transact(cx, |editor, cx| {
             editor.set_clip_at_line_ends(false, cx);
+            let mut original_columns: HashMap<_, _> = Default::default();
             editor.move_selections(cx, |map, selection| {
                 let original_head = selection.head();
                 motion.expand_selection(map, selection, true);
-                selection.goal = SelectionGoal::Column(original_head.column());
+                original_columns.insert(selection.id, original_head.column());
             });
             editor.insert(&"", cx);
 
             // Fixup cursor position after the deletion
             editor.set_clip_at_line_ends(true, cx);
-            editor.move_cursors(cx, |map, mut cursor, goal| {
+            editor.move_selections(cx, |map, selection| {
+                let mut cursor = selection.head();
                 if motion.linewise() {
-                    if let SelectionGoal::Column(column) = goal {
-                        *cursor.column_mut() = column
+                    if let Some(column) = original_columns.get(&selection.id) {
+                        *cursor.column_mut() = *column
                     }
                 }
-
-                (map.clip_point(cursor, Bias::Left), SelectionGoal::None)
+                cursor = map.clip_point(cursor, Bias::Left);
+                selection.collapse_to(cursor, selection.goal)
             });
         });
     });