Skip to content

Commit

Permalink
Surround with line-endings on ms<ret> (#4571)
Browse files Browse the repository at this point in the history
This change makes `ms<ret>` work similarly to `t<ret>` and related
find commands: when the next event is a keypress of Enter, surround
the selection with the document's line-endings.
  • Loading branch information
the-mikedavis committed Feb 1, 2023
1 parent d5f17d3 commit 685cd38
Showing 1 changed file with 20 additions and 16 deletions.
36 changes: 20 additions & 16 deletions helix-term/src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4775,35 +4775,39 @@ fn select_textobject(cx: &mut Context, objtype: textobject::TextObject) {

fn surround_add(cx: &mut Context) {
cx.on_next_key(move |cx, event| {
let ch = match event.char() {
Some(ch) => ch,
let (view, doc) = current!(cx.editor);
// surround_len is the number of new characters being added.
let (open, close, surround_len) = match event.char() {
Some(ch) => {
let (o, c) = surround::get_pair(ch);
let mut open = Tendril::new();
open.push(o);
let mut close = Tendril::new();
close.push(c);
(open, close, 2)
}
None if event.code == KeyCode::Enter => (
doc.line_ending.as_str().into(),
doc.line_ending.as_str().into(),
2 * doc.line_ending.len_chars(),
),
None => return,
};
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 selection = doc.selection(view.id);
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);
let mut c = Tendril::new();
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
changes.push((range.from(), range.from(), Some(open.clone())));
changes.push((range.to(), range.to(), Some(close.clone())));

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;
}

Expand Down

0 comments on commit 685cd38

Please sign in to comment.