Select text inserted by shell or paste (#4458)
This follows changes in Kakoune to the same effects: * p/<space>p:266d1c37d0
* !/<A-!>:85b78dda2e
Selecting the new data inserted by shell or pasting is often more useful than retaining a selection of the pre-paste/insert content.
This commit is contained in:
parent
9a898be959
commit
d6323b7cbc
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user