Skip to content

Commit

Permalink
Select text inserted by shell or paste (helix-editor#4458)
Browse files Browse the repository at this point in the history
This follows changes in Kakoune to the same effects:

* p/<space>p: mawww/kakoune@266d1c3
* !/<A-!>: mawww/kakoune@85b78dd

Selecting the new data inserted by shell or pasting is often more
useful than retaining a selection of the pre-paste/insert content.
  • Loading branch information
the-mikedavis authored and Frederik Vestre committed Feb 6, 2023
1 parent f9b1965 commit e0a343f
Showing 1 changed file with 20 additions and 2 deletions.
22 changes: 20 additions & 2 deletions helix-term/src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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);
}

Expand Down Expand Up @@ -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() {
Expand All @@ -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);
}
Expand Down

0 comments on commit e0a343f

Please sign in to comment.