From 1569d2000ba9622f23f658e60af173c2a6b8c88b Mon Sep 17 00:00:00 2001 From: Austen Adler Date: Fri, 18 Nov 2022 02:46:03 +0000 Subject: [PATCH] Select surrounding characters when using match/surround (m) mode (#4752) Co-authored-by: Austen Adler --- helix-term/src/commands.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index 4e3f07677..b00e02b94 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -4530,8 +4530,13 @@ fn surround_add(cx: &mut Context) { let (view, doc) = current!(cx.editor); let selection = doc.selection(view.id); 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 ranges = SmallVec::with_capacity(selection.len()); + let mut offs = 0; + for range in selection.iter() { let mut o = Tendril::new(); o.push(open); @@ -4539,9 +4544,19 @@ fn surround_add(cx: &mut Context) { c.push(close); changes.push((range.from(), range.from(), Some(o))); 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); }) }