summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-02-22 22:13:49 +0100
committerBram Moolenaar <Bram@vim.org>2021-02-22 22:13:49 +0100
commit41f0895c6e3c7b921e3c102ad42be52b1be48018 (patch)
treee4668b4038b821836524e9fe3b94ec315ee88873
parent6bfc475f717aa0412d13163d47ff6210fa611fb5 (diff)
downloadvim-git-41f0895c6e3c7b921e3c102ad42be52b1be48018.tar.gz
patch 8.2.2542: highlight of char beyond line end is not correctv8.2.2542
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)
-rw-r--r--src/match.c27
-rw-r--r--src/testdir/dumps/Test_hlsearch_1.dump6
-rw-r--r--src/testdir/dumps/Test_hlsearch_2.dump6
-rw-r--r--src/testdir/test_search.vim20
-rw-r--r--src/version.c2
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,