# HG changeset patch # User Bram Moolenaar # Date 1421595992 -3600 # Node ID dfd593d81818468ad60cad4fc66c561299f8d969 # Parent a7b7e93711f6e131e4ddfbb7fceca184b10e9416 updated for version 7.4.582 Problem: Can't match "%>80v" properly. (Axel Bender) Solution: Correctly handle ">". (Christian Brabandt) diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c --- a/src/regexp_nfa.c +++ b/src/regexp_nfa.c @@ -6441,16 +6441,26 @@ nfa_regmatch(prog, start, submatch, m) { int op = t->state->c - NFA_VCOL; colnr_T col = (colnr_T)(reginput - regline); + win_T *wp = reg_win == NULL ? curwin : reg_win; /* Bail out quickly when there can't be a match, avoid the * overhead of win_linetabsize() on long lines. */ - if ((col > t->state->val && op != 1) - || (col - 1 > t->state->val && op == 1)) + if (op != 1 && col > t->state->val) break; - result = nfa_re_num_cmp(t->state->val, op, - (long_u)win_linetabsize( - reg_win == NULL ? curwin : reg_win, - regline, col) + 1); + result = FALSE; + if (op == 1 && col - 1 > t->state->val && col > 100) + { + int ts = wp->w_buffer->b_p_ts; + + /* Guess that a character won't use more columns than + * 'tabstop', with a minimum of 4. */ + if (ts < 4) + ts = 4; + result = col > t->state->val * ts; + } + if (!result) + result = nfa_re_num_cmp(t->state->val, op, + (long_u)win_linetabsize(wp, regline, col) + 1); if (result) { add_here = TRUE; diff --git a/src/testdir/test64.in b/src/testdir/test64.in --- a/src/testdir/test64.in +++ b/src/testdir/test64.in @@ -7,6 +7,7 @@ actually tried. STARTTEST :so small.vim :" tl is a List of Lists with: +:" regexp engine :" regexp pattern :" text to test the pattern on :" expected match (optional) @@ -451,6 +452,9 @@ STARTTEST :"""" Skip adding state twice :call add(tl, [2, '^\%(\%(^\s*#\s*if\>\|#\s*if\)\)\(\%>1c.*$\)\@=', "#if FOO", "#if", ' FOO']) :" +:""" Test \%V atom +:call add(tl, [2, '\%>70vGesamt', 'Jean-Michel Charlier & Victor Hubinon\Gesamtausgabe [Salleck] Buck Danny {Jean-Michel Charlier & Victor Hubinon}\Gesamtausgabe', 'Gesamt']) +:" :"""" Run the tests :" :for t in tl diff --git a/src/testdir/test64.ok b/src/testdir/test64.ok --- a/src/testdir/test64.ok +++ b/src/testdir/test64.ok @@ -1030,6 +1030,9 @@ OK 2 - [0-9a-zA-Z]\{8}-\([0-9a-zA-Z]\{4} OK 0 - ^\%(\%(^\s*#\s*if\>\|#\s*if\)\)\(\%>1c.*$\)\@= OK 1 - ^\%(\%(^\s*#\s*if\>\|#\s*if\)\)\(\%>1c.*$\)\@= OK 2 - ^\%(\%(^\s*#\s*if\>\|#\s*if\)\)\(\%>1c.*$\)\@= +OK 0 - \%>70vGesamt +OK 1 - \%>70vGesamt +OK 2 - \%>70vGesamt multi-line tests OK 0 - ^.\(.\).\_..\1. OK 1 - ^.\(.\).\_..\1. diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 582, +/**/ 581, /**/ 580,