1
0
forked from aniani/vim

patch 8.2.2885: searching for \%'> does not match linewise end of line

Problem:    searching for \%'> does not match linewise end of line. (Tim Chase)
Solution:   Match end of line if column is MAXCOL. (closes #8238)
This commit is contained in:
Bram Moolenaar
2021-05-24 22:56:15 +02:00
parent 1e469c72ee
commit 872bee557e
4 changed files with 54 additions and 17 deletions

View File

@@ -3357,11 +3357,22 @@ regmatch(
pos = getmark_buf(rex.reg_buf, mark, FALSE); pos = getmark_buf(rex.reg_buf, mark, FALSE);
if (pos == NULL // mark doesn't exist if (pos == NULL // mark doesn't exist
|| pos->lnum <= 0 // mark isn't set in reg_buf || pos->lnum <= 0) // mark isn't set in reg_buf
|| (pos->lnum == rex.lnum + rex.reg_firstlnum {
? (pos->col == (colnr_T)(rex.input - rex.line) status = RA_NOMATCH;
}
else
{
colnr_T pos_col = pos->lnum == rex.lnum + rex.reg_firstlnum
&& pos->col == MAXCOL
? (colnr_T)STRLEN(reg_getline(
pos->lnum - rex.reg_firstlnum))
: pos->col;
if ((pos->lnum == rex.lnum + rex.reg_firstlnum
? (pos_col == (colnr_T)(rex.input - rex.line)
? (cmp == '<' || cmp == '>') ? (cmp == '<' || cmp == '>')
: (pos->col < (colnr_T)(rex.input - rex.line) : (pos_col < (colnr_T)(rex.input - rex.line)
? cmp != '>' ? cmp != '>'
: cmp != '<')) : cmp != '<'))
: (pos->lnum < rex.lnum + rex.reg_firstlnum : (pos->lnum < rex.lnum + rex.reg_firstlnum
@@ -3369,6 +3380,7 @@ regmatch(
: cmp != '<'))) : cmp != '<')))
status = RA_NOMATCH; status = RA_NOMATCH;
} }
}
break; break;
case RE_VISUAL: case RE_VISUAL:

View File

@@ -6806,23 +6806,31 @@ nfa_regmatch(
{ {
pos_T *pos = getmark_buf(rex.reg_buf, t->state->val, FALSE); pos_T *pos = getmark_buf(rex.reg_buf, t->state->val, FALSE);
// Compare the mark position to the match position. // Compare the mark position to the match position, if the mark
result = (pos != NULL // mark doesn't exist // exists and mark is set in reg_buf.
&& pos->lnum > 0 // mark isn't set in reg_buf if (pos != NULL && pos->lnum > 0)
&& (pos->lnum == rex.lnum + rex.reg_firstlnum {
? (pos->col == (colnr_T)(rex.input - rex.line) colnr_T pos_col = pos->lnum == rex.lnum + rex.reg_firstlnum
&& pos->col == MAXCOL
? (colnr_T)STRLEN(reg_getline(
pos->lnum - rex.reg_firstlnum))
: pos->col;
result = (pos->lnum == rex.lnum + rex.reg_firstlnum
? (pos_col == (colnr_T)(rex.input - rex.line)
? t->state->c == NFA_MARK ? t->state->c == NFA_MARK
: (pos->col < (colnr_T)(rex.input - rex.line) : (pos_col < (colnr_T)(rex.input - rex.line)
? t->state->c == NFA_MARK_GT ? t->state->c == NFA_MARK_GT
: t->state->c == NFA_MARK_LT)) : t->state->c == NFA_MARK_LT))
: (pos->lnum < rex.lnum + rex.reg_firstlnum : (pos->lnum < rex.lnum + rex.reg_firstlnum
? t->state->c == NFA_MARK_GT ? t->state->c == NFA_MARK_GT
: t->state->c == NFA_MARK_LT))); : t->state->c == NFA_MARK_LT));
if (result) if (result)
{ {
add_here = TRUE; add_here = TRUE;
add_state = t->state->out; add_state = t->state->out;
} }
}
break; break;
} }

View File

@@ -1332,13 +1332,28 @@ func Test_look_behind()
bwipe! bwipe!
endfunc endfunc
func Test_search_visual_area_linewise()
new
call setline(1, ['aa', 'bb', 'cc'])
exe "normal 2GV\<Esc>"
for engine in [1, 2]
exe 'set regexpengine=' .. engine
exe "normal gg/\\%'<\<CR>>"
call assert_equal([0, 2, 1, 0, 1], getcurpos(), 'engine ' .. engine)
exe "normal gg/\\%'>\<CR>"
call assert_equal([0, 2, 2, 0, 2], getcurpos(), 'engine ' .. engine)
endfor
bwipe!
set regexpengine&
endfunc
func Test_search_sentence() func Test_search_sentence()
new new
" this used to cause a crash " this used to cause a crash
call assert_fails("/\\%')", 'E486:')
call assert_fails("/", 'E486:')
/\%'( /\%'(
/ /
bwipe
endfunc endfunc
" Test that there is no crash when there is a last search pattern but no last " Test that there is no crash when there is a last search pattern but no last

View File

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