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.
This commit is contained in:
parent
37f0b9ee15
commit
351c1e7e55
2 changed files with 17 additions and 10 deletions
|
@ -41,11 +41,14 @@ pub fn find_nth_pairs_pos(
|
|||
let (open, close) = get_pair(ch);
|
||||
|
||||
let (open_pos, close_pos) = if open == close {
|
||||
// find_nth* do not consider current character; +1/-1 to include them
|
||||
(
|
||||
search::find_nth_prev(text, open, pos + 1, n, true)?,
|
||||
search::find_nth_next(text, close, pos - 1, n, true)?,
|
||||
)
|
||||
let prev = search::find_nth_prev(text, open, pos, n, true);
|
||||
let next = search::find_nth_next(text, close, pos, n, true);
|
||||
if text.char(pos) == open {
|
||||
// curosr is *on* a pair
|
||||
next.map(|n| (pos, n)).or_else(|| prev.map(|p| (p, pos)))?
|
||||
} else {
|
||||
(prev?, next?)
|
||||
}
|
||||
} else {
|
||||
(
|
||||
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, 2), Some((4, 21)));
|
||||
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]
|
||||
|
|
|
@ -247,14 +247,13 @@ mod test {
|
|||
"samexx 'single' surround pairs",
|
||||
vec![
|
||||
(3, Inside, (3, 3), '\'', 1),
|
||||
// FIXME: surround doesn't work when *on* same chars pair
|
||||
// (7, Inner, (8, 13), '\'', 1),
|
||||
(7, Inside, (8, 13), '\'', 1),
|
||||
(10, Inside, (8, 13), '\'', 1),
|
||||
// (14, Inner, (8, 13), '\'', 1),
|
||||
(14, Inside, (8, 13), '\'', 1),
|
||||
(3, Around, (3, 3), '\'', 1),
|
||||
// (7, Around, (7, 14), '\'', 1),
|
||||
(7, Around, (7, 14), '\'', 1),
|
||||
(10, Around, (7, 14), '\'', 1),
|
||||
// (14, Around, (7, 14), '\'', 1),
|
||||
(14, Around, (7, 14), '\'', 1),
|
||||
],
|
||||
),
|
||||
(
|
||||
|
|
Loading…
Add table
Reference in a new issue