0
0
mirror of https://github.com/vim/vim.git synced 2025-10-29 09:37:35 -04:00

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)
This commit is contained in:
Bram Moolenaar
2021-02-22 22:13:49 +01:00
parent 6bfc475f71
commit 41f0895c6e
5 changed files with 58 additions and 3 deletions

View File

@@ -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;

View File

@@ -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|

View File

@@ -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|

View File

@@ -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

View File

@@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
2542,
/**/
2541,
/**/