# HG changeset patch # User Bram Moolenaar # Date 1614028503 -3600 # Node ID bb2e921d26015cc723f6c97b9da6746c804726fb # Parent ff467cccc34c93e92845cccffdf2212076c7fd97 patch 8.2.2542: highlight of char beyond line end is not correct Commit: https://github.com/vim/vim/commit/41f0895c6e3c7b921e3c102ad42be52b1be48018 Author: Bram Moolenaar Date: Mon Feb 22 22:13:49 2021 +0100 patch 8.2.2542: highlight of char beyond line end is not correct Problem: Highlight of char beyond line end is not correct. (Chuan Wei Foo) Solution: Fix counting NUL as one cell. Draw one more character if the EOL is part of the match. (closes #7883) diff --git a/src/match.c b/src/match.c --- 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 * 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 --- /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 --- /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 --- 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, "/\\_.*\") + 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 --- 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,