aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--helix-term/src/commands.rs6
-rw-r--r--helix-term/tests/test/commands.rs22
2 files changed, 27 insertions, 1 deletions
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index ef963477..ae9e35f1 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -3476,6 +3476,7 @@ fn paste_impl(values: &[String], doc: &mut Document, view: &mut View, action: Pa
let text = doc.text();
let selection = doc.selection(view.id);
+ let mut offset = 0;
let mut ranges = SmallVec::with_capacity(selection.len());
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()
.map(|content| content.chars().count())
.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)
});
diff --git a/helix-term/tests/test/commands.rs b/helix-term/tests/test/commands.rs
index aadf104b..e78e6c9f 100644
--- a/helix-term/tests/test/commands.rs
+++ b/helix-term/tests/test/commands.rs
@@ -193,3 +193,25 @@ async fn test_goto_file_impl() -> anyhow::Result<()> {
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(())
+}