diff options
author | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2020-12-09 19:12:48 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-09 19:12:48 -0500 |
commit | 638f5d5b953a117cf7855e1f6d23823ec233381f (patch) | |
tree | 13dd67fbe2507f27a995cd7b533e331622cf3e59 | |
parent | bfed67e00ecdf71e0c7d17b1fd802f223b42c800 (diff) | |
parent | 9900e68ae39e701a4b713875920090ce1a28fe28 (diff) | |
download | rneovim-638f5d5b953a117cf7855e1f6d23823ec233381f.tar.gz rneovim-638f5d5b953a117cf7855e1f6d23823ec233381f.tar.bz2 rneovim-638f5d5b953a117cf7855e1f6d23823ec233381f.zip |
Merge pull request #13497 from seandewar/vim-8.2.2121
vim-patch:8.2.{2121,2123}
-rw-r--r-- | src/nvim/popupmnu.c | 1 | ||||
-rw-r--r-- | src/nvim/regexp.c | 16 | ||||
-rw-r--r-- | src/nvim/regexp_nfa.c | 16 | ||||
-rw-r--r-- | src/nvim/testdir/test_regexp_latin.vim | 7 |
4 files changed, 40 insertions, 0 deletions
diff --git a/src/nvim/popupmnu.c b/src/nvim/popupmnu.c index f242b7d71a..551a650045 100644 --- a/src/nvim/popupmnu.c +++ b/src/nvim/popupmnu.c @@ -742,6 +742,7 @@ static int pum_set_selected(int n, int repeat) // Edit a new, empty buffer. Set options for a "wipeout" // buffer. set_option_value("swf", 0L, NULL, OPT_LOCAL); + set_option_value("bl", 0L, NULL, OPT_LOCAL); set_option_value("bt", 0L, "nofile", OPT_LOCAL); set_option_value("bh", 0L, "wipe", OPT_LOCAL); set_option_value("diff", 0L, NULL, OPT_LOCAL); diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c index 1c88bd4ba4..2878e73573 100644 --- a/src/nvim/regexp.c +++ b/src/nvim/regexp.c @@ -3605,6 +3605,22 @@ theend: if (backpos.ga_maxlen > BACKPOS_INITIAL) ga_clear(&backpos); + // Make sure the end is never before the start. Can happen when \zs and + // \ze are used. + if (REG_MULTI) { + const lpos_T *const start = &rex.reg_mmatch->startpos[0]; + const lpos_T *const end = &rex.reg_mmatch->endpos[0]; + + if (end->lnum < start->lnum + || (end->lnum == start->lnum && end->col < start->col)) { + rex.reg_mmatch->endpos[0] = rex.reg_mmatch->startpos[0]; + } + } else { + if (rex.reg_match->endp[0] < rex.reg_match->startp[0]) { + rex.reg_match->endp[0] = rex.reg_match->startp[0]; + } + } + return retval; } diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c index 7dfd16fb4f..137b2304c0 100644 --- a/src/nvim/regexp_nfa.c +++ b/src/nvim/regexp_nfa.c @@ -6591,6 +6591,22 @@ static long nfa_regexec_both(char_u *line, colnr_T startcol, #endif theend: + // Make sure the end is never before the start. Can happen when \zs and + // \ze are used. + if (REG_MULTI) { + const lpos_T *const start = &rex.reg_mmatch->startpos[0]; + const lpos_T *const end = &rex.reg_mmatch->endpos[0]; + + if (end->lnum < start->lnum + || (end->lnum == start->lnum && end->col < start->col)) { + rex.reg_mmatch->endpos[0] = rex.reg_mmatch->startpos[0]; + } + } else { + if (rex.reg_match->endp[0] < rex.reg_match->startp[0]) { + rex.reg_match->endp[0] = rex.reg_match->startp[0]; + } + } + return retval; } diff --git a/src/nvim/testdir/test_regexp_latin.vim b/src/nvim/testdir/test_regexp_latin.vim index 2ee0ee1c0c..1bb2ee53de 100644 --- a/src/nvim/testdir/test_regexp_latin.vim +++ b/src/nvim/testdir/test_regexp_latin.vim @@ -755,6 +755,13 @@ func Test_start_end_of_buffer_match() bwipe! endfunc +func Test_ze_before_zs() + call assert_equal('', matchstr(' ', '\%#=1\ze \zs')) + call assert_equal('', matchstr(' ', '\%#=2\ze \zs')) + call assert_equal(repeat([''], 10), matchlist(' ', '\%#=1\ze \zs')) + call assert_equal(repeat([''], 10), matchlist(' ', '\%#=2\ze \zs')) +endfunc + " Check for detecting error func Test_regexp_error() set regexpengine=2 |