Select surrounding characters when using match/surround (m) mode (#4752)

Co-authored-by: Austen Adler <agadler@austenadler.com>
pull/4800/head
Austen Adler 2 years ago committed by GitHub
parent 9a4e6fdf25
commit 1569d2000b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -4530,8 +4530,13 @@ fn surround_add(cx: &mut Context) {
let (view, doc) = current!(cx.editor); let (view, doc) = current!(cx.editor);
let selection = doc.selection(view.id); let selection = doc.selection(view.id);
let (open, close) = surround::get_pair(ch); let (open, close) = surround::get_pair(ch);
// The number of chars in get_pair
let surround_len = 2;
let mut changes = Vec::with_capacity(selection.len() * 2); let mut changes = Vec::with_capacity(selection.len() * 2);
let mut ranges = SmallVec::with_capacity(selection.len());
let mut offs = 0;
for range in selection.iter() { for range in selection.iter() {
let mut o = Tendril::new(); let mut o = Tendril::new();
o.push(open); o.push(open);
@ -4539,9 +4544,19 @@ fn surround_add(cx: &mut Context) {
c.push(close); c.push(close);
changes.push((range.from(), range.from(), Some(o))); changes.push((range.from(), range.from(), Some(o)));
changes.push((range.to(), range.to(), Some(c))); changes.push((range.to(), range.to(), Some(c)));
// Add 2 characters to the range to select them
ranges.push(
Range::new(offs + range.from(), offs + range.to() + surround_len)
.with_direction(range.direction()),
);
// Add 2 characters to the offset for the next ranges
offs += surround_len;
} }
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); apply_transaction(&transaction, doc, view);
}) })
} }

Loading…
Cancel
Save