Mercurial > vim
changeset 24000:bb2e921d2601 v8.2.2542
patch 8.2.2542: highlight of char beyond line end is not correct
Commit: https://github.com/vim/vim/commit/41f0895c6e3c7b921e3c102ad42be52b1be48018
Author: Bram Moolenaar <Bram@vim.org>
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)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 22 Feb 2021 22:15:03 +0100 |
parents | ff467cccc34c |
children | b0191a86ab43 |
files | src/match.c src/testdir/dumps/Test_hlsearch_1.dump src/testdir/dumps/Test_hlsearch_2.dump src/testdir/test_search.vim src/version.c |
diffstat | 5 files changed, 58 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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;
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|
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|
--- 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