diff options
author | David Bürgin <676c7473@gmail.com> | 2015-05-14 14:23:50 +0200 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2015-05-26 01:07:37 -0400 |
commit | 5a9ad68b258f33ebd7fa0a5da47b308f50f1e5e7 (patch) | |
tree | a69628cbe4e02d21f76cb22297b3952a9b9a1ff3 /src | |
parent | c6da5033362c76f3641f4871046a40465fe0615a (diff) | |
download | rneovim-5a9ad68b258f33ebd7fa0a5da47b308f50f1e5e7.tar.gz rneovim-5a9ad68b258f33ebd7fa0a5da47b308f50f1e5e7.tar.bz2 rneovim-5a9ad68b258f33ebd7fa0a5da47b308f50f1e5e7.zip |
vim-patch:7.4.582 #2653
Problem: Can't match "%>80v" properly. (Axel Bender)
Solution: Correctly handle ">". (Christian Brabandt)
https://github.com/vim/vim/commit/v7-4-582
See https://groups.google.com/d/msg/vim_dev/n-02i4FnOcw/P3Yyx1OLeXgJ
Slightly adapted due to the long_u refactoring in
2ceb1c74d591a07183ee02baf6ff1e205c87c6b8.
Reviewed-by: Florian Walch <florian@fwalch.com>
Fixes #2726
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/regexp_nfa.c | 28 | ||||
-rw-r--r-- | src/nvim/testdir/test64.in | 4 | ||||
-rw-r--r-- | src/nvim/testdir/test64.ok | 3 | ||||
-rw-r--r-- | src/nvim/version.c | 2 |
4 files changed, 27 insertions, 10 deletions
diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c index 9cf35c53bb..4ef91814ac 100644 --- a/src/nvim/regexp_nfa.c +++ b/src/nvim/regexp_nfa.c @@ -5742,17 +5742,27 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, regsubs_T *subm // 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; } - uintmax_t lts = win_linetabsize(reg_win == NULL ? curwin : reg_win, - regline, - col); - assert(t->state->val >= 0); - result = nfa_re_num_cmp((uintmax_t)t->state->val, - op, - lts + 1); + + result = FALSE; + win_T *wp = reg_win == NULL ? curwin : reg_win; + if (op == 1 && col - 1 > t->state->val && col > 100) { + long 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) { + uintmax_t lts = win_linetabsize(wp, regline, col); + assert(t->state->val >= 0); + result = nfa_re_num_cmp((uintmax_t)t->state->val, op, lts + 1); + } if (result) { add_here = true; add_state = t->state->out; diff --git a/src/nvim/testdir/test64.in b/src/nvim/testdir/test64.in index f2452fc0f3..fd19d3af32 100644 --- a/src/nvim/testdir/test64.in +++ b/src/nvim/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/nvim/testdir/test64.ok b/src/nvim/testdir/test64.ok index ffc0b5341f..92f06ea9f3 100644 --- a/src/nvim/testdir/test64.ok +++ b/src/nvim/testdir/test64.ok @@ -1030,6 +1030,9 @@ OK 2 - [0-9a-zA-Z]\{8}-\([0-9a-zA-Z]\{4}-\)\{3}[0-9a-zA-Z]\{12} 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/nvim/version.c b/src/nvim/version.c index d9bdafbb68..432b0130bc 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -218,7 +218,7 @@ static int included_patches[] = { 585, //584 NA //583 NA - //582, + 582, //581 NA 580, 579, |