diff --git a/src/selectors.hh b/src/selectors.hh index 442a93c8..f718cbd3 100644 --- a/src/selectors.hh +++ b/src/selectors.hh @@ -239,13 +239,12 @@ inline bool find_last_match(const Buffer& buffer, const BufferIterator& pos, const bool is_pos_eol = is_eol(buffer, pos.coord()); const bool is_pos_eow = is_eow(buffer, pos.coord()); auto begin = buffer.begin(); - while (regex_search(begin, pos, matches, regex, - match_flags(is_bol(begin.coord()), is_pos_eol, is_pos_eow))) + while (begin != pos and regex_search(begin, pos, matches, regex, + match_flags(is_bol(begin.coord()), is_pos_eol, is_pos_eow))) { - if (begin == matches[0].second) - break; - begin = matches[0].second; - res.swap(matches); + begin = utf8::next(matches[0].first, pos); + if (res.empty() or matches[0].second > res[0].second) + res.swap(matches); } return not res.empty(); } diff --git a/test/unit/search-reverse-rightmost/missed-match/cmd b/test/unit/search-reverse-rightmost/missed-match/cmd new file mode 100644 index 00000000..2e666042 --- /dev/null +++ b/test/unit/search-reverse-rightmost/missed-match/cmd @@ -0,0 +1 @@ +(ab|baba) diff --git a/test/unit/search-reverse-rightmost/missed-match/in b/test/unit/search-reverse-rightmost/missed-match/in new file mode 100644 index 00000000..88a28c1f --- /dev/null +++ b/test/unit/search-reverse-rightmost/missed-match/in @@ -0,0 +1 @@ +ababa%(b) diff --git a/test/unit/search-reverse-rightmost/missed-match/selections b/test/unit/search-reverse-rightmost/missed-match/selections new file mode 100644 index 00000000..0e46b314 --- /dev/null +++ b/test/unit/search-reverse-rightmost/missed-match/selections @@ -0,0 +1 @@ +baba diff --git a/test/unit/search-reverse-rightmost/overlap/cmd b/test/unit/search-reverse-rightmost/overlap/cmd new file mode 100644 index 00000000..d9568408 --- /dev/null +++ b/test/unit/search-reverse-rightmost/overlap/cmd @@ -0,0 +1 @@ +... diff --git a/test/unit/search-reverse-rightmost/overlap/in b/test/unit/search-reverse-rightmost/overlap/in new file mode 100644 index 00000000..c4144a07 --- /dev/null +++ b/test/unit/search-reverse-rightmost/overlap/in @@ -0,0 +1 @@ +abcdefg%(h) diff --git a/test/unit/search-reverse-rightmost/overlap/selections b/test/unit/search-reverse-rightmost/overlap/selections new file mode 100644 index 00000000..1505b408 --- /dev/null +++ b/test/unit/search-reverse-rightmost/overlap/selections @@ -0,0 +1 @@ +efg