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

Problem:    search() loops forever if "skip" is TRUE for all matches.
Solution:   Keep the position of the first match.

3d79f0a430

Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
zeertzjq
2023-01-23 07:36:01 +08:00
committed by GitHub
parent 1b642648f6
commit 0f633ff494
2 changed files with 19 additions and 1 deletions

View File

@@ -6239,7 +6239,9 @@ static int search_cmn(typval_T *argvars, pos_T *match_pos, int *flagsp)
// didn't find it or no skip argument // didn't find it or no skip argument
break; break;
} }
firstpos = pos; if (firstpos.lnum == 0) {
firstpos = pos;
}
// If the skip expression matches, ignore this match. // If the skip expression matches, ignore this match.
{ {

View File

@@ -1377,6 +1377,22 @@ func Test_subst_word_under_cursor()
set noincsearch set noincsearch
endfunc 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() func Test_search_undefined_behaviour()
CheckFeature terminal CheckFeature terminal