tweak editor selection mutating functions

This commit is contained in:
Keith Simmons 2022-04-28 13:46:06 -07:00
parent 42b900774e
commit 74b467aaa8
2 changed files with 13 additions and 11 deletions

View file

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

View file

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