1use crate::{motion::Motion, utils::copy_selections_content, Vim};
2use collections::HashMap;
3use gpui::MutableAppContext;
4
5pub fn yank_over(vim: &mut Vim, motion: Motion, cx: &mut MutableAppContext) {
6 vim.update_active_editor(cx, |editor, cx| {
7 editor.transact(cx, |editor, cx| {
8 editor.set_clip_at_line_ends(false, cx);
9 let mut original_positions: HashMap<_, _> = Default::default();
10 editor.change_selections(None, cx, |s| {
11 s.move_with(|map, selection| {
12 let original_position = (selection.head(), selection.goal);
13 motion.expand_selection(map, selection, true);
14 original_positions.insert(selection.id, original_position);
15 });
16 });
17 copy_selections_content(editor, motion.linewise(), cx);
18 editor.change_selections(None, cx, |s| {
19 s.move_with(|_, selection| {
20 let (head, goal) = original_positions.remove(&selection.id).unwrap();
21 selection.collapse_to(head, goal);
22 });
23 });
24 });
25 });
26}