diff options
-rw-r--r-- | src/match.c | 27 | ||||
-rw-r--r-- | src/testdir/dumps/Test_hlsearch_1.dump | 6 | ||||
-rw-r--r-- | src/testdir/dumps/Test_hlsearch_2.dump | 6 | ||||
-rw-r--r-- | src/testdir/test_search.vim | 20 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 58 insertions, 3 deletions
diff --git a/src/match.c b/src/match.c index 0df7bfe2f..f383d8a1a 100644 --- a/src/match.c +++ b/src/match.c @@ -792,7 +792,15 @@ update_search_hl( // highlight empty match, try again after // it if (has_mbyte) - shl->endcol += (*mb_ptr2len)(*line + shl->endcol); + { + char_u *p = *line + shl->endcol; + + if (*p == NUL) + // consistent with non-mbyte + ++shl->endcol; + else + shl->endcol += (*mb_ptr2len)(p); + } else ++shl->endcol; } @@ -842,18 +850,31 @@ get_prevcol_hl_flag(win_T *wp, match_T *search_hl, long curcol) int prevcol_hl_flag = FALSE; matchitem_T *cur; // points to the match list +#if defined(FEAT_PROP_POPUP) + // don't do this in a popup window + if (popup_is_popup(wp)) + return FALSE; +#endif + // we're not really at that column when skipping some text if ((long)(wp->w_p_wrap ? wp->w_skipcol : wp->w_leftcol) > prevcol) ++prevcol; - if (!search_hl->is_addpos && prevcol == (long)search_hl->startcol) + // Highlight a character after the end of the line if the match started + // at the end of the line or when the match continues in the next line + // (match includes the line break). + if (!search_hl->is_addpos && (prevcol == (long)search_hl->startcol + || (prevcol > (long)search_hl->startcol + && search_hl->endcol == MAXCOL))) prevcol_hl_flag = TRUE; else { cur = wp->w_match_head; while (cur != NULL) { - if (!cur->hl.is_addpos && prevcol == (long)cur->hl.startcol) + if (!cur->hl.is_addpos && (prevcol == (long)cur->hl.startcol + || (prevcol > (long)cur->hl.startcol + && cur->hl.endcol == MAXCOL))) { prevcol_hl_flag = TRUE; break; diff --git a/src/testdir/dumps/Test_hlsearch_1.dump b/src/testdir/dumps/Test_hlsearch_1.dump new file mode 100644 index 000000000..abcd91c56 --- /dev/null +++ b/src/testdir/dumps/Test_hlsearch_1.dump @@ -0,0 +1,6 @@ +|x+0&#ffff4012@2| | +0&#ffffff0@45 +>x+8&#ffff4012@2| | +8&#ffffff0@45 +|x+0&#ffff4012@2| | +0&#ffffff0@45 +|~+0#4040ff13&| @48 +|~| @48 +| +0#0000000&@31|2|,|1| @10|A|l@1| diff --git a/src/testdir/dumps/Test_hlsearch_2.dump b/src/testdir/dumps/Test_hlsearch_2.dump new file mode 100644 index 000000000..0cb13c3aa --- /dev/null +++ b/src/testdir/dumps/Test_hlsearch_2.dump @@ -0,0 +1,6 @@ +|x+0&#ffff4012@2| | +0&#ffffff0@45 +|x+0&#ffff4012@2| | +0&#ffffff0@45 +>x+8&#ffff4012@2| | +8&#ffffff0@45 +|~+0#4040ff13&| @48 +|~| @48 +|/+0#0000000&|\|_|.|*| @26|3|,|1| @10|A|l@1| diff --git a/src/testdir/test_search.vim b/src/testdir/test_search.vim index 2dc53d97d..5fed81c90 100644 --- a/src/testdir/test_search.vim +++ b/src/testdir/test_search.vim @@ -944,6 +944,26 @@ func Test_incsearch_search_dump() call delete('Xis_search_script') endfunc +func Test_hlsearch_dump() + CheckOption hlsearch + CheckScreendump + + call writefile([ + \ 'set hlsearch cursorline', + \ 'call setline(1, ["xxx", "xxx", "xxx"])', + \ '/.*', + \ '2', + \ ], 'Xhlsearch_script') + let buf = RunVimInTerminal('-S Xhlsearch_script', {'rows': 6, 'cols': 50}) + call VerifyScreenDump(buf, 'Test_hlsearch_1', {}) + + call term_sendkeys(buf, "/\\_.*\<CR>") + call VerifyScreenDump(buf, 'Test_hlsearch_2', {}) + + call StopVimInTerminal(buf) + call delete('Xhlsearch_script') +endfunc + func Test_incsearch_substitute() CheckOption incsearch diff --git a/src/version.c b/src/version.c index d6ee9bbb2..757a14dfd 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2542, +/**/ 2541, /**/ 2540, |