mirror of
https://github.com/ilyakooo0/helix.git
synced 2024-11-29 13:32:09 +03:00
Fix range offsets in multi-selection paste (#4608)
* Fix range offsets in multi-selection paste
d6323b7cbc
introduced a regression with
multi-selection paste where pasting would not adjust the ranges
correctly. To fix it, we need to track the total number of characters
inserted in each changed selection and use that offset to slide each
new range forwards.
* Inherit selection directions on paste
* Add an integration-test for multi-selection pasting
This commit is contained in:
parent
4ec2a21c6e
commit
48a3965ab4
@ -3476,6 +3476,7 @@ fn paste_impl(values: &[String], doc: &mut Document, view: &mut View, action: Pa
|
|||||||
let text = doc.text();
|
let text = doc.text();
|
||||||
let selection = doc.selection(view.id);
|
let selection = doc.selection(view.id);
|
||||||
|
|
||||||
|
let mut offset = 0;
|
||||||
let mut ranges = SmallVec::with_capacity(selection.len());
|
let mut ranges = SmallVec::with_capacity(selection.len());
|
||||||
|
|
||||||
let transaction = Transaction::change_by_selection(text, selection, |range| {
|
let transaction = Transaction::change_by_selection(text, selection, |range| {
|
||||||
@ -3501,8 +3502,11 @@ fn paste_impl(values: &[String], doc: &mut Document, view: &mut View, action: Pa
|
|||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|content| content.chars().count())
|
.map(|content| content.chars().count())
|
||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
|
let anchor = offset + pos;
|
||||||
|
|
||||||
ranges.push(Range::new(pos, pos + value_len));
|
let new_range = Range::new(anchor, anchor + value_len).with_direction(range.direction());
|
||||||
|
ranges.push(new_range);
|
||||||
|
offset += value_len;
|
||||||
|
|
||||||
(pos, pos, value)
|
(pos, pos, value)
|
||||||
});
|
});
|
||||||
|
@ -193,3 +193,25 @@ async fn test_goto_file_impl() -> anyhow::Result<()> {
|
|||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test(flavor = "multi_thread")]
|
||||||
|
async fn test_multi_selection_paste() -> anyhow::Result<()> {
|
||||||
|
test((
|
||||||
|
platform_line(indoc! {"\
|
||||||
|
#[|lorem]#
|
||||||
|
#(|ipsum)#
|
||||||
|
#(|dolor)#
|
||||||
|
"})
|
||||||
|
.as_str(),
|
||||||
|
"yp",
|
||||||
|
platform_line(indoc! {"\
|
||||||
|
lorem#[|lorem]#
|
||||||
|
ipsum#(|ipsum)#
|
||||||
|
dolor#(|dolor)#
|
||||||
|
"})
|
||||||
|
.as_str(),
|
||||||
|
))
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user