WIP making paste better
This commit is contained in:
parent
58e57d0150
commit
ed52f8a8a3
4 changed files with 29 additions and 4 deletions
|
@ -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"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue