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 vim/vim#8238)
872bee557e
This commit is contained in:
Jan Edmund Lazo 2021-05-25 22:15:14 -04:00
parent 31ea80649d
commit 7e0d50b16e
No known key found for this signature in database
GPG Key ID: 64915E6E9F735B15
3 changed files with 56 additions and 27 deletions

View File

@ -3974,17 +3974,25 @@ static bool regmatch(
pos = getmark_buf(rex.reg_buf, mark, false);
if (pos == NULL // mark doesn't exist
|| 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)
? (cmp == '<' || cmp == '>')
: (pos->col < (colnr_T)(rex.input - rex.line)
? cmp != '>'
: cmp != '<'))
: (pos->lnum < rex.lnum + rex.reg_firstlnum
? cmp != '>'
: cmp != '<'))) {
|| pos->lnum <= 0) { // mark isn't set in reg_buf
status = RA_NOMATCH;
} else {
const 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 == '>')
: (pos_col < (colnr_T)(rex.input - rex.line)
? cmp != '>'
: cmp != '<'))
: (pos->lnum < rex.lnum + rex.reg_firstlnum
? cmp != '>'
: cmp != '<')) {
status = RA_NOMATCH;
}
}
}
break;

View File

@ -6055,21 +6055,27 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,
{
pos_T *pos = getmark_buf(rex.reg_buf, t->state->val, false);
// Compare the mark position to the match position.
result = (pos != NULL // mark doesn't exist
&& 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)
? t->state->c == NFA_MARK
: (pos->col < (colnr_T)(rex.input - rex.line)
? t->state->c == NFA_MARK_GT
: t->state->c == NFA_MARK_LT))
: (pos->lnum < rex.lnum + rex.reg_firstlnum
? t->state->c == NFA_MARK_GT
: t->state->c == NFA_MARK_LT)));
if (result) {
add_here = true;
add_state = t->state->out;
// Compare the mark position to the match position, if the mark
// exists and mark is set in reg_buf.
if (pos != NULL && pos->lnum > 0) {
const 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
: (pos_col < (colnr_T)(rex.input - rex.line)
? t->state->c == NFA_MARK_GT
: t->state->c == NFA_MARK_LT))
: (pos->lnum < rex.lnum + rex.reg_firstlnum
? t->state->c == NFA_MARK_GT
: t->state->c == NFA_MARK_LT);
if (result) {
add_here = true;
add_state = t->state->out;
}
}
break;
}

View File

@ -1177,13 +1177,28 @@ func Test_look_behind()
bwipe!
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()
new
" this used to cause a crash
call assert_fails("/\\%')", 'E486')
call assert_fails("/", 'E486')
/\%'(
/
bwipe
endfunc
" Test that there is no crash when there is a last search pattern but no last