changeset 28469:9ff0e5a29037 v8.2.4759

patch 8.2.4759: CurSearch highlight does not work for multi-line match Commit: https://github.com/vim/vim/commit/693ccd11606b59eb0f81c6c1948679e61ada4022 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Apr 16 12:04:37 2022 +0100 patch 8.2.4759: CurSearch highlight does not work for multi-line match Problem: CurSearch highlight does not work for multi-line match. Solution: Check cursor position before adjusting columns. (closes https://github.com/vim/vim/issues/10133)
author Bram Moolenaar <Bram@vim.org>
date Sat, 16 Apr 2022 13:15:03 +0200
parents ac542ed74852
children c116bcac141e
files src/match.c src/structs.h src/testdir/dumps/Test_hlsearch_cursearch_multiple_line.dump src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_1.dump src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_2.dump src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_3.dump src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_4.dump src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_5.dump src/testdir/test_search.vim src/version.c
diffstat 10 files changed, 75 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/src/match.c
+++ b/src/match.c
@@ -396,6 +396,7 @@ next_search_hl_pos(
 	shl->rm.endpos[0].lnum = 0;
 	shl->rm.endpos[0].col = end;
 	shl->is_addpos = TRUE;
+	shl->has_cursor = FALSE;
 	posmatch->cur = found + 1;
 	return 1;
     }
@@ -655,6 +656,7 @@ prepare_search_hl_line(
 	shl->lines = 0;
 	shl->attr_cur = 0;
 	shl->is_addpos = FALSE;
+	shl->has_cursor = FALSE;
 	if (cur != NULL)
 	    cur->pos.cur = 0;
 	next_search_hl(wp, search_hl, shl, lnum, mincol,
@@ -679,6 +681,17 @@ prepare_search_hl_line(
 		shl->lines = shl->rm.endpos[0].lnum - shl->rm.startpos[0].lnum;
 	    else
 		shl->lines = 1;
+
+	    // check if the cursor is in the match before changing the columns
+	    if (wp->w_cursor.lnum >= shl->lnum
+			&& wp->w_cursor.lnum
+					  <= shl->lnum + shl->rm.endpos[0].lnum
+			&& (wp->w_cursor.lnum > shl->lnum
+				|| wp->w_cursor.col >= shl->rm.startpos[0].col)
+			&& (wp->w_cursor.lnum < shl->lnum + shl->lines
+				  || wp->w_cursor.col < shl->rm.endpos[0].col))
+		shl->has_cursor = TRUE;
+
 	    // Highlight one character for an empty match.
 	    if (shl->startcol == shl->endcol)
 	    {
@@ -775,14 +788,8 @@ update_search_hl(
 # endif
 		// Highlight the match were the cursor is using the CurSearch
 		// group.
-		if (shl == search_hl
-			&& wp->w_cursor.lnum >= shl->lnum
-			&& wp->w_cursor.lnum < shl->lnum + shl->lines
-			&& wp->w_cursor.col >= shl->startcol
-			&& wp->w_cursor.col < shl->endcol)
-		{
+		if (shl == search_hl && shl->has_cursor)
 		    shl->attr_cur = HL_ATTR(HLF_LC);
-		}
 
 	    }
 	    else if (col == shl->endcol)
--- a/src/structs.h
+++ b/src/structs.h
@@ -3337,8 +3337,10 @@ typedef struct
     linenr_T	first_lnum; // first lnum to search for multi-line pat
     colnr_T	startcol;   // in win_line() points to char where HL starts
     colnr_T	endcol;	    // in win_line() points to char where HL ends
-    int		is_addpos;  // position specified directly by
+    char	is_addpos;  // position specified directly by
 			    // matchaddpos(). TRUE/FALSE
+    char	has_cursor; // TRUE if the cursor is inside the match, used for
+			    // CurSearch
 #ifdef FEAT_RELTIME
     proftime_T	tm;	    // for a time limit
 #endif
rename from src/testdir/dumps/Test_hlsearch_cursearch_multiple_line.dump
rename to src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_1.dump
new file mode 100644
--- /dev/null
+++ b/src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_2.dump
@@ -0,0 +1,9 @@
+|-+0&#ffffff0@2| @56
+|a|b|c|d>e+0&#4040ff13|f|g| | +0&#ffffff0@51
+|h+0&#4040ff13|i|j|k+0&#ffffff0|l| @54
+|-@2| @56
+|a|b|c|d|e+0&#ffff4012|f|g| | +0&#ffffff0@51
+|h+0&#ffff4012|i|j|k+0&#ffffff0|l| @54
+|~+0#4040ff13&| @58
+|~| @58
+|/+0#0000000&|e|f|g|\|n|h|i|j| @32|2|,|5| @10|A|l@1| 
new file mode 100644
--- /dev/null
+++ b/src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_3.dump
@@ -0,0 +1,9 @@
+|-+0&#ffffff0@2| @56
+|a|b|c>d|e+0&#ffff4012|f|g| | +0&#ffffff0@51
+|h+0&#ffff4012|i|j|k+0&#ffffff0|l| @54
+|-@2| @56
+|a|b|c|d|e+0&#ffff4012|f|g| | +0&#ffffff0@51
+|h+0&#ffff4012|i|j|k+0&#ffffff0|l| @54
+|~+0#4040ff13&| @58
+|~| @58
+| +0#0000000&@41|2|,|4| @10|A|l@1| 
new file mode 100644
--- /dev/null
+++ b/src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_4.dump
@@ -0,0 +1,9 @@
+|-+0&#ffffff0@2| @56
+|a|b|c|d|e+0&#ffff4012|f|g| | +0&#ffffff0@51
+|h+0&#ffff4012|i|j>k+0&#ffffff0|l| @54
+|-@2| @56
+|a|b|c|d|e+0&#ffff4012|f|g| | +0&#ffffff0@51
+|h+0&#ffff4012|i|j|k+0&#ffffff0|l| @54
+|~+0#4040ff13&| @58
+|~| @58
+| +0#0000000&@41|3|,|4| @10|A|l@1| 
new file mode 100644
--- /dev/null
+++ b/src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_5.dump
@@ -0,0 +1,9 @@
+|-+0&#ffffff0@2| @56
+|a|b|c|d|e+0&#4040ff13|f|g| | +0&#ffffff0@51
+|h+0&#4040ff13|i>j|k+0&#ffffff0|l| @54
+|-@2| @56
+|a|b|c|d|e+0&#ffff4012|f|g| | +0&#ffffff0@51
+|h+0&#ffff4012|i|j|k+0&#ffffff0|l| @54
+|~+0#4040ff13&| @58
+|~| @58
+| +0#0000000&@41|3|,|3| @10|A|l@1| 
--- a/src/testdir/test_search.vim
+++ b/src/testdir/test_search.vim
@@ -1060,7 +1060,17 @@ func Test_hlsearch_cursearch()
   call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_single_line_3', {})
 
   call term_sendkeys(buf, "gg/foo\\nbar\<CR>")
-  call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_multiple_line', {})
+  call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_multiple_line_1', {})
+
+  call term_sendkeys(buf, ":call setline(1, ['---', 'abcdefg', 'hijkl', '---', 'abcdefg', 'hijkl'])\<CR>")
+  call term_sendkeys(buf, "gg/efg\\nhij\<CR>")
+  call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_multiple_line_2', {})
+  call term_sendkeys(buf, "h\<C-L>")
+  call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_multiple_line_3', {})
+  call term_sendkeys(buf, "j\<C-L>")
+  call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_multiple_line_4', {})
+  call term_sendkeys(buf, "h\<C-L>")
+  call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_multiple_line_5', {})
 
   call StopVimInTerminal(buf)
   call delete('Xhlsearch_cursearch')
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    4759,
+/**/
     4758,
 /**/
     4757,