]> granicus.if.org Git - vim/commitdiff
patch 8.2.4759: CurSearch highlight does not work for multi-line match v8.2.4759
authorBram Moolenaar <Bram@vim.org>
Sat, 16 Apr 2022 11:04:37 +0000 (12:04 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 16 Apr 2022 11:04:37 +0000 (12:04 +0100)
Problem:    CurSearch highlight does not work for multi-line match.
Solution:   Check cursor position before adjusting columns. (closes #10133)

src/match.c
src/structs.h
src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_1.dump [moved from src/testdir/dumps/Test_hlsearch_cursearch_multiple_line.dump with 100% similarity]
src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_2.dump [new file with mode: 0644]
src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_3.dump [new file with mode: 0644]
src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_4.dump [new file with mode: 0644]
src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_5.dump [new file with mode: 0644]
src/testdir/test_search.vim
src/version.c

index d74d8d73ff3bf3593d97079c5ab1c3325109860d..9edba8d999edb409e11e61a0562f3899be31cd10 100644 (file)
@@ -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)
index 176a86c1a3bbaec5ab9226b9db325b4bee103984..b77fa348859c5c87905b779984b7a9b154eacd17 100644 (file)
@@ -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
diff --git a/src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_2.dump b/src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_2.dump
new file mode 100644 (file)
index 0000000..7b091cf
--- /dev/null
@@ -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| 
diff --git a/src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_3.dump b/src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_3.dump
new file mode 100644 (file)
index 0000000..ef03675
--- /dev/null
@@ -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| 
diff --git a/src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_4.dump b/src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_4.dump
new file mode 100644 (file)
index 0000000..2235295
--- /dev/null
@@ -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| 
diff --git a/src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_5.dump b/src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_5.dump
new file mode 100644 (file)
index 0000000..2294566
--- /dev/null
@@ -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| 
index 4ed249d39ddae1b7270cb803c5edda12f7b497bc..97ddfdbc6e694bb6611473f492debce81a9a2579 100644 (file)
@@ -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')
index 2a3e8d6030e1d7194a5c54a297a64e30d5d576b8..4c28b37891bb3c6be1a99d0b8c695049432f0368 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4759,
 /**/
     4758,
 /**/