mirror of
https://github.com/vim/vim.git
synced 2025-10-30 09:47:20 -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:
27
src/match.c
27
src/match.c
@@ -792,7 +792,15 @@ update_search_hl(
|
|||||||
// highlight empty match, try again after
|
// highlight empty match, try again after
|
||||||
// it
|
// it
|
||||||
if (has_mbyte)
|
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
|
else
|
||||||
++shl->endcol;
|
++shl->endcol;
|
||||||
}
|
}
|
||||||
@@ -842,18 +850,31 @@ get_prevcol_hl_flag(win_T *wp, match_T *search_hl, long curcol)
|
|||||||
int prevcol_hl_flag = FALSE;
|
int prevcol_hl_flag = FALSE;
|
||||||
matchitem_T *cur; // points to the match list
|
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
|
// we're not really at that column when skipping some text
|
||||||
if ((long)(wp->w_p_wrap ? wp->w_skipcol : wp->w_leftcol) > prevcol)
|
if ((long)(wp->w_p_wrap ? wp->w_skipcol : wp->w_leftcol) > prevcol)
|
||||||
++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;
|
prevcol_hl_flag = TRUE;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cur = wp->w_match_head;
|
cur = wp->w_match_head;
|
||||||
while (cur != NULL)
|
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;
|
prevcol_hl_flag = TRUE;
|
||||||
break;
|
break;
|
||||||
|
|||||||
6
src/testdir/dumps/Test_hlsearch_1.dump
Normal file
6
src/testdir/dumps/Test_hlsearch_1.dump
Normal 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|
|
||||||
6
src/testdir/dumps/Test_hlsearch_2.dump
Normal file
6
src/testdir/dumps/Test_hlsearch_2.dump
Normal 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|
|
||||||
@@ -944,6 +944,26 @@ func Test_incsearch_search_dump()
|
|||||||
call delete('Xis_search_script')
|
call delete('Xis_search_script')
|
||||||
endfunc
|
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()
|
func Test_incsearch_substitute()
|
||||||
CheckOption incsearch
|
CheckOption incsearch
|
||||||
|
|
||||||
|
|||||||
@@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
2542,
|
||||||
/**/
|
/**/
|
||||||
2541,
|
2541,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
Reference in New Issue
Block a user