Fix surround bug when cursor on same pair

For example when the cursor is _on_ the `'` in `'word'`, the cursor
wouldn't move because the search for a matching pair started _from_ the
position of the cursor and simply found itself.
pull/408/head
Gokul Soumya 3 years ago committed by Ivan Tham
parent 37f0b9ee15
commit 351c1e7e55

@ -41,11 +41,14 @@ pub fn find_nth_pairs_pos(
let (open, close) = get_pair(ch); let (open, close) = get_pair(ch);
let (open_pos, close_pos) = if open == close { let (open_pos, close_pos) = if open == close {
// find_nth* do not consider current character; +1/-1 to include them let prev = search::find_nth_prev(text, open, pos, n, true);
( let next = search::find_nth_next(text, close, pos, n, true);
search::find_nth_prev(text, open, pos + 1, n, true)?, if text.char(pos) == open {
search::find_nth_next(text, close, pos - 1, n, true)?, // curosr is *on* a pair
) next.map(|n| (pos, n)).or_else(|| prev.map(|p| (p, pos)))?
} else {
(prev?, next?)
}
} else { } else {
( (
find_nth_open_pair(text, open, close, pos, n)?, find_nth_open_pair(text, open, close, pos, n)?,
@ -198,6 +201,11 @@ mod test {
assert_eq!(find_nth_pairs_pos(slice, '\'', 13, 1), Some((10, 15))); assert_eq!(find_nth_pairs_pos(slice, '\'', 13, 1), Some((10, 15)));
assert_eq!(find_nth_pairs_pos(slice, '\'', 13, 2), Some((4, 21))); assert_eq!(find_nth_pairs_pos(slice, '\'', 13, 2), Some((4, 21)));
assert_eq!(find_nth_pairs_pos(slice, '\'', 13, 3), Some((0, 27))); assert_eq!(find_nth_pairs_pos(slice, '\'', 13, 3), Some((0, 27)));
// cursor on the quotes
assert_eq!(find_nth_pairs_pos(slice, '\'', 10, 1), Some((10, 15)));
// this is the best we can do since opening and closing pairs are same
assert_eq!(find_nth_pairs_pos(slice, '\'', 0, 1), Some((0, 4)));
assert_eq!(find_nth_pairs_pos(slice, '\'', 27, 1), Some((21, 27)));
} }
#[test] #[test]

@ -247,14 +247,13 @@ mod test {
"samexx 'single' surround pairs", "samexx 'single' surround pairs",
vec![ vec![
(3, Inside, (3, 3), '\'', 1), (3, Inside, (3, 3), '\'', 1),
// FIXME: surround doesn't work when *on* same chars pair (7, Inside, (8, 13), '\'', 1),
// (7, Inner, (8, 13), '\'', 1),
(10, Inside, (8, 13), '\'', 1), (10, Inside, (8, 13), '\'', 1),
// (14, Inner, (8, 13), '\'', 1), (14, Inside, (8, 13), '\'', 1),
(3, Around, (3, 3), '\'', 1), (3, Around, (3, 3), '\'', 1),
// (7, Around, (7, 14), '\'', 1), (7, Around, (7, 14), '\'', 1),
(10, Around, (7, 14), '\'', 1), (10, Around, (7, 14), '\'', 1),
// (14, Around, (7, 14), '\'', 1), (14, Around, (7, 14), '\'', 1),
], ],
), ),
( (

Loading…
Cancel
Save