patch 9.0.1233: search() loops forever if "skip" is TRUE for all matches

Problem:    search() loops forever if "skip" is TRUE for all matches.
Solution:   Keep the position of the first match.
This commit is contained in:
Bram Moolenaar
2023-01-22 20:14:26 +00:00
parent d343c60df4
commit 3d79f0a430
3 changed files with 20 additions and 1 deletions

View File

@ -8794,7 +8794,8 @@ search_cmn(typval_T *argvars, pos_T *match_pos, int *flagsp)
if (subpatnum == FAIL || !use_skip)
// didn't find it or no skip argument
break;
firstpos = pos;
if (firstpos.lnum == 0)
firstpos = pos;
// If the skip expression matches, ignore this match.
{

View File

@ -1411,6 +1411,22 @@ func Test_subst_word_under_cursor()
set noincsearch
endfunc
func Test_search_skip_all_matches()
enew
call setline(1, ['no match here',
\ 'match this line',
\ 'nope',
\ 'match in this line',
\ 'last line',
\ ])
call cursor(1, 1)
let lnum = search('this', '', 0, 0, 'getline(".") =~ "this line"')
" Only check that no match is found. Previously it searched forever.
call assert_equal(0, lnum)
bwipe!
endfunc
func Test_search_undefined_behaviour()
CheckFeature terminal

View File

@ -695,6 +695,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1233,
/**/
1232,
/**/