mirror of https://github.com/helix-editor/helix
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
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…
Reference in New Issue