summaryrefslogtreecommitdiff
path: root/helix-term
diff options
context:
space:
mode:
Diffstat (limited to 'helix-term')
-rw-r--r--helix-term/src/commands.rs22
1 files changed, 20 insertions, 2 deletions
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index aae9979d..a6ee6263 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -3471,6 +3471,8 @@ 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 ranges = SmallVec::with_capacity(selection.len());
+
let transaction = Transaction::change_by_selection(text, selection, |range| {
let pos = match (action, linewise) {
// paste linewise before
@@ -3487,8 +3489,21 @@ fn paste_impl(values: &[String], doc: &mut Document, view: &mut View, action: Pa
// paste at cursor
(Paste::Cursor, _) => range.cursor(text.slice(..)),
};
- (pos, pos, values.next())
+
+ let value = values.next();
+
+ let value_len = value
+ .as_ref()
+ .map(|content| content.chars().count())
+ .unwrap_or_default();
+
+ ranges.push(Range::new(pos, pos + value_len));
+
+ (pos, pos, value)
});
+
+ let transaction = transaction.with_selection(Selection::new(ranges, selection.primary_index()));
+
apply_transaction(&transaction, doc, view);
}
@@ -4742,6 +4757,7 @@ fn shell(cx: &mut compositor::Context, cmd: &str, behavior: &ShellBehavior) {
let selection = doc.selection(view.id);
let mut changes = Vec::with_capacity(selection.len());
+ let mut ranges = SmallVec::with_capacity(selection.len());
let text = doc.text().slice(..);
for range in selection.ranges() {
@@ -4765,11 +4781,13 @@ fn shell(cx: &mut compositor::Context, cmd: &str, behavior: &ShellBehavior) {
ShellBehavior::Append => (range.to(), range.to()),
_ => (range.from(), range.from()),
};
+ ranges.push(Range::new(to, to + output.chars().count()));
changes.push((from, to, Some(output)));
}
if behavior != &ShellBehavior::Ignore {
- let transaction = Transaction::change(doc.text(), changes.into_iter());
+ let transaction = Transaction::change(doc.text(), changes.into_iter())
+ .with_selection(Selection::new(ranges, selection.primary_index()));
apply_transaction(&transaction, doc, view);
doc.append_changes_to_history(view.id);
}