tweak editor selection mutating functions
This commit is contained in:
parent
42b900774e
commit
74b467aaa8
2 changed files with 13 additions and 11 deletions
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue