WIP making paste better

This commit is contained in:
Keith Simmons 2022-07-04 21:10:20 -07:00
parent 58e57d0150
commit ed52f8a8a3
4 changed files with 29 additions and 4 deletions

View file

@ -140,7 +140,8 @@
"c": "vim::VisualChange", "c": "vim::VisualChange",
"d": "vim::VisualDelete", "d": "vim::VisualDelete",
"x": "vim::VisualDelete", "x": "vim::VisualDelete",
"y": "vim::VisualYank" "y": "vim::VisualYank",
"p": "vim::Paste"
} }
}, },
{ {

View file

@ -149,6 +149,28 @@ impl SelectionsCollection {
selections selections
} }
pub fn all_adjusted_display(
&self,
cx: &mut MutableAppContext,
) -> (DisplaySnapshot, Vec<Selection<DisplayPoint>>) {
if self.line_mode {
let selections = self.all::<Point>(cx);
let map = self.display_map(cx);
let result = selections
.into_iter()
.map(|mut selection| {
let new_range = map.expand_to_line(selection.range());
selection.start = new_range.start;
selection.end = new_range.end;
selection.map(|point| point.to_display_point(&map))
})
.collect();
(map, result)
} else {
self.all_display(cx)
}
}
pub fn disjoint_in_range<'a, D>( pub fn disjoint_in_range<'a, D>(
&self, &self,
range: Range<Anchor>, range: Range<Anchor>,
@ -175,7 +197,7 @@ impl SelectionsCollection {
} }
pub fn all_display( pub fn all_display(
&mut self, &self,
cx: &mut MutableAppContext, cx: &mut MutableAppContext,
) -> (DisplaySnapshot, Vec<Selection<DisplayPoint>>) { ) -> (DisplaySnapshot, Vec<Selection<DisplayPoint>>) {
let display_map = self.display_map(cx); let display_map = self.display_map(cx);

View file

@ -7,6 +7,7 @@ use std::borrow::Cow;
use crate::{ use crate::{
motion::Motion, motion::Motion,
state::{Mode, Operator}, state::{Mode, Operator},
utils::copy_selections_content,
Vim, Vim,
}; };
use change::init as change_init; use change::init as change_init;
@ -200,11 +201,12 @@ fn paste(_: &mut Workspace, _: &Paste, cx: &mut ViewContext<Workspace>) {
vim.update_active_editor(cx, |editor, cx| { vim.update_active_editor(cx, |editor, cx| {
editor.transact(cx, |editor, cx| { editor.transact(cx, |editor, cx| {
if let Some(item) = cx.as_mut().read_from_clipboard() { if let Some(item) = cx.as_mut().read_from_clipboard() {
copy_selections_content(editor, editor.selections.line_mode, cx);
let mut clipboard_text = Cow::Borrowed(item.text()); let mut clipboard_text = Cow::Borrowed(item.text());
if let Some(mut clipboard_selections) = if let Some(mut clipboard_selections) =
item.metadata::<Vec<ClipboardSelection>>() item.metadata::<Vec<ClipboardSelection>>()
{ {
let (display_map, selections) = editor.selections.all_display(cx); let (display_map, selections) = editor.selections.all_adjusted_display(cx);
let all_selections_were_entire_line = let all_selections_were_entire_line =
clipboard_selections.iter().all(|s| s.is_entire_line); clipboard_selections.iter().all(|s| s.is_entire_line);
if clipboard_selections.len() != selections.len() { if clipboard_selections.len() != selections.len() {

View file

@ -6,7 +6,7 @@ use workspace::Workspace;
use crate::{motion::Motion, state::Mode, utils::copy_selections_content, Vim}; use crate::{motion::Motion, state::Mode, utils::copy_selections_content, Vim};
actions!(vim, [VisualDelete, VisualChange, VisualYank]); actions!(vim, [VisualDelete, VisualChange, VisualYank, VisualPaste]);
pub fn init(cx: &mut MutableAppContext) { pub fn init(cx: &mut MutableAppContext) {
cx.add_action(change); cx.add_action(change);