Surround with line-endings on ms<ret>
(#4571)
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.
This commit is contained in:
parent
d5f17d3f69
commit
685cd383a3
1 changed files with 19 additions and 15 deletions
|
@ -4775,35 +4775,39 @@ fn select_textobject(cx: &mut Context, objtype: textobject::TextObject) {
|
||||||
|
|
||||||
fn surround_add(cx: &mut Context) {
|
fn surround_add(cx: &mut Context) {
|
||||||
cx.on_next_key(move |cx, event| {
|
cx.on_next_key(move |cx, event| {
|
||||||
let ch = match event.char() {
|
let (view, doc) = current!(cx.editor);
|
||||||
Some(ch) => ch,
|
// 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,
|
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 changes = Vec::with_capacity(selection.len() * 2);
|
||||||
let mut ranges = SmallVec::with_capacity(selection.len());
|
let mut ranges = SmallVec::with_capacity(selection.len());
|
||||||
let mut offs = 0;
|
let mut offs = 0;
|
||||||
|
|
||||||
for range in selection.iter() {
|
for range in selection.iter() {
|
||||||
let mut o = Tendril::new();
|
changes.push((range.from(), range.from(), Some(open.clone())));
|
||||||
o.push(open);
|
changes.push((range.to(), range.to(), Some(close.clone())));
|
||||||
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
|
|
||||||
ranges.push(
|
ranges.push(
|
||||||
Range::new(offs + range.from(), offs + range.to() + surround_len)
|
Range::new(offs + range.from(), offs + range.to() + surround_len)
|
||||||
.with_direction(range.direction()),
|
.with_direction(range.direction()),
|
||||||
);
|
);
|
||||||
|
|
||||||
// Add 2 characters to the offset for the next ranges
|
|
||||||
offs += surround_len;
|
offs += surround_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue