Problem: The pattern "\_s\zs" matches at EOL.
Solution: Make the pattern "\_s\zs" match at the start of the next line.
(closes #11617)
#ifdef FEAT_SYN_HL
static void cleanup_zsubexpr(void);
#endif
-static void reg_nextline(void);
static int match_with_backref(linenr_T start_lnum, colnr_T start_col, linenr_T end_lnum, colnr_T end_col, int *bytelen);
/*
break;
}
}
- semsg(_(e_nfa_regexp_unknown_operator_percent_chr), no_Magic(c));
+ semsg(_(e_nfa_regexp_unknown_operator_percent_chr),
+ no_Magic(c));
return FAIL;
}
break;
for (j = 0; j < sub->in_use; j++)
if (REG_MULTI)
- fprintf(log_fd, "*** group %d, start: c=%d, l=%d, end: c=%d, l=%d\n",
+ fprintf(log_fd,
+ "*** group %d, start: c=%d, l=%d, end: c=%d, l=%d\n",
j,
sub->list.multi[j].start_col,
(int)sub->list.multi[j].start_lnum,
{
sub->list.multi[subidx].start_lnum = rex.lnum;
sub->list.multi[subidx].start_col =
- (colnr_T)(rex.input - rex.line + off);
+ (colnr_T)(rex.input - rex.line + off);
}
sub->list.multi[subidx].end_lnum = -1;
}
}
else if (!vim_iswordc_buf(curc, rex.reg_buf)
|| (rex.input > rex.line
- && vim_iswordc_buf(rex.input[-1], rex.reg_buf)))
+ && vim_iswordc_buf(rex.input[-1], rex.reg_buf)))
result = FALSE;
if (result)
{
case NFA_NEWL:
if (curc == NUL && !rex.reg_line_lbr && REG_MULTI
- && rex.lnum <= rex.reg_maxline)
+ && rex.lnum <= rex.reg_maxline)
{
go_to_nextline = TRUE;
// Pass -1 for the offset, which means taking the position
&& rex.lnum == 0
&& clen != 0
&& (rex.reg_maxcol == 0
- || (colnr_T)(rex.input - rex.line) < rex.reg_maxcol))
+ || (colnr_T)(rex.input - rex.line) < rex.reg_maxcol))
|| (nfa_endp != NULL
&& (REG_MULTI
? (rex.lnum < nfa_endp->se_u.pos.lnum
if (dir == FORWARD && at_first_line)
{
match_ok = TRUE;
+ matchcol = col;
+
/*
* When the match starts in a next line it's certainly
* past the start position.
}
else
{
- matchcol = matchpos.col;
+ // Advance "matchcol" to the next character.
+ // This does not use matchpos.col, because
+ // "\zs" may have have set it.
if (ptr[matchcol] != NUL)
{
if (has_mbyte)
set ignorecase& smartcase&
let &encoding = save_enc
- close!
+ bwipe!
endfunc
" Test searching past the end of a file
call setline(1, ['Line'])
exe "normal /\\n\\zs\<CR>"
call assert_equal([1, 4], [line('.'), col('.')])
- close!
+ bwipe!
+endfunc
+
+" Test setting the start of the match and still finding a next match in the
+" same line.
+func Test_search_set_start_same_line()
+ new
+ set cpo-=c
+
+ call setline(1, ['1', '2', '3 .', '4', '5'])
+ exe "normal /\\_s\\zs\\S\<CR>"
+ call assert_equal([2, 1], [line('.'), col('.')])
+ exe 'normal n'
+ call assert_equal([3, 1], [line('.'), col('.')])
+ exe 'normal n'
+ call assert_equal([3, 3], [line('.'), col('.')])
+ exe 'normal n'
+ call assert_equal([4, 1], [line('.'), col('.')])
+ exe 'normal n'
+ call assert_equal([5, 1], [line('.'), col('.')])
+
+ set cpo+=c
+ bwipe!
endfunc
" Test for various search offsets
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 950,
/**/
949,
/**/