]> granicus.if.org Git - vim/commitdiff
patch 8.2.4805: CurSearch used for all matches in current line v8.2.4805
authorBram Moolenaar <Bram@vim.org>
Fri, 22 Apr 2022 19:07:21 +0000 (20:07 +0100)
committerBram Moolenaar <Bram@vim.org>
Fri, 22 Apr 2022 19:07:21 +0000 (20:07 +0100)
Problem:    CurSearch used for all matches in current line.
Solution:   Don't use the non-zero line count. (closes #10247)

src/match.c
src/testdir/dumps/Test_hlsearch_cursearch_single_line_1.dump
src/testdir/dumps/Test_hlsearch_cursearch_single_line_2.dump
src/testdir/dumps/Test_hlsearch_cursearch_single_line_2a.dump [new file with mode: 0644]
src/testdir/dumps/Test_hlsearch_cursearch_single_line_2b.dump [new file with mode: 0644]
src/testdir/test_search.vim
src/version.c

index 9edba8d999edb409e11e61a0562f3899be31cd10..fb130ae4f0b6c3b79320edf918c21a36baf1472b 100644 (file)
@@ -617,6 +617,26 @@ prepare_search_hl(win_T *wp, match_T *search_hl, linenr_T lnum)
     }
 }
 
+/*
+ * Update "shl->has_cursor" based on the match in "shl" and the cursor
+ * position.
+ */
+    static void
+check_cur_search_hl(win_T *wp, match_T *shl)
+{
+    long linecount = shl->rm.endpos[0].lnum - shl->rm.startpos[0].lnum;
+
+    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 + linecount
+                                 || wp->w_cursor.col < shl->rm.endpos[0].col))
+       shl->has_cursor = TRUE;
+    else
+       shl->has_cursor = FALSE;
+}
+
 /*
  * Prepare for 'hlsearch' and match highlighting in one window line.
  * Return TRUE if there is such highlighting and set "search_attr" to the
@@ -677,20 +697,13 @@ prepare_search_hl_line(
                shl->endcol = shl->rm.endpos[0].col;
            else
                shl->endcol = MAXCOL;
-           if (shl->rm.endpos[0].lnum != shl->rm.startpos[0].lnum)
-               shl->lines = shl->rm.endpos[0].lnum - shl->rm.startpos[0].lnum;
-           else
+           shl->lines = shl->rm.endpos[0].lnum - shl->rm.startpos[0].lnum;
+           if (shl->lines == 0)
                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;
+           if (shl == search_hl)
+               check_cur_search_hl(wp, shl);
 
            // Highlight one character for an empty match.
            if (shl->startcol == shl->endcol)
@@ -811,6 +824,10 @@ update_search_hl(
                    else
                        shl->endcol = MAXCOL;
 
+                   // check if the cursor is in the match
+                   if (shl == search_hl)
+                       check_cur_search_hl(wp, shl);
+
                    if (shl->startcol == shl->endcol)
                    {
                        // highlight empty match, try again after
index ef2922f87df4d5c1878d0e3fe0eea3c22d2463ee..ab726651afe82328b1773ea3b9212c486a633109 100644 (file)
@@ -2,7 +2,7 @@
 >f+0&#4040ff13|o@1| +0&#ffffff0@56
 |b|a|r| @56
 |b|a|z| @56
-|f+0&#ffff4012|o@1| +0&#ffffff0@56
+|f+0&#ffff4012|o@1| +0&#ffffff0|t|h|e| |f+0&#ffff4012|o@1| +0&#ffffff0|a|n|d| |f+0&#ffff4012|o@1| +0&#ffffff0@40
 |b|a|r| @56
 |~+0#4040ff13&| @58
 |~| @58
index 26e03e0a7e2b5e37e92dafc5d7cb9f61462e16ae..dd4aa89512e0db436ace1e55892e3d553b12e704 100644 (file)
@@ -2,7 +2,7 @@
 |f+0&#ffff4012|o@1| +0&#ffffff0@56
 |b|a|r| @56
 |b|a|z| @56
->f+0&#4040ff13|o@1| +0&#ffffff0@56
+>f+0&#4040ff13|o@1| +0&#ffffff0|t|h|e| |f+0&#ffff4012|o@1| +0&#ffffff0|a|n|d| |f+0&#ffff4012|o@1| +0&#ffffff0@40
 |b|a|r| @56
 |~+0#4040ff13&| @58
 |~| @58
diff --git a/src/testdir/dumps/Test_hlsearch_cursearch_single_line_2a.dump b/src/testdir/dumps/Test_hlsearch_cursearch_single_line_2a.dump
new file mode 100644 (file)
index 0000000..2cc3c17
--- /dev/null
@@ -0,0 +1,9 @@
+|o+0&#ffffff0|n|e| @56
+|f+0&#ffff4012|o@1| +0&#ffffff0@56
+|b|a|r| @56
+|b|a|z| @56
+|f+0&#ffff4012|o@1| +0&#ffffff0|t|h|e| >f+0&#4040ff13|o@1| +0&#ffffff0|a|n|d| |f+0&#ffff4012|o@1| +0&#ffffff0@40
+|b|a|r| @56
+|~+0#4040ff13&| @58
+|~| @58
+|/+0#0000000&|f|o@1| @37|5|,|9| @10|A|l@1| 
diff --git a/src/testdir/dumps/Test_hlsearch_cursearch_single_line_2b.dump b/src/testdir/dumps/Test_hlsearch_cursearch_single_line_2b.dump
new file mode 100644 (file)
index 0000000..0b20bd5
--- /dev/null
@@ -0,0 +1,9 @@
+|o+0&#ffffff0|n|e| @56
+|f+0&#ffff4012|o@1| +0&#ffffff0@56
+|b|a|r| @56
+|b|a|z| @56
+|f+0&#ffff4012|o@1| +0&#ffffff0|t|h|e| |f+0&#ffff4012|o@1| +0&#ffffff0|a|n|d| >f+0&#4040ff13|o@1| +0&#ffffff0@40
+|b|a|r| @56
+|~+0#4040ff13&| @58
+|~| @58
+|/+0#0000000&|f|o@1| @37|5|,|1|7| @9|A|l@1| 
index 97ddfdbc6e694bb6611473f492debce81a9a2579..2a767c0c372da153cda1f29a718f4f272fe1f802 100644 (file)
@@ -1043,7 +1043,7 @@ func Test_hlsearch_cursearch()
 
   let lines =<< trim END
     set hlsearch scrolloff=0
-    call setline(1, ['one', 'foo', 'bar', 'baz', 'foo', 'bar'])
+    call setline(1, ['one', 'foo', 'bar', 'baz', 'foo the foo and foo', 'bar'])
     hi Search ctermbg=yellow
     hi CurSearch ctermbg=blue
   END
@@ -1056,7 +1056,14 @@ func Test_hlsearch_cursearch()
   call term_sendkeys(buf, "n")
   call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_single_line_2', {})
 
-  call term_sendkeys(buf, "?\<CR>")
+  call term_sendkeys(buf, "n")
+  call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_single_line_2a', {})
+
+  call term_sendkeys(buf, "n")
+  call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_single_line_2b', {})
+
+  call term_sendkeys(buf, ":call setline(5, 'foo')\<CR>")
+  call term_sendkeys(buf, "0?\<CR>")
   call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_single_line_3', {})
 
   call term_sendkeys(buf, "gg/foo\\nbar\<CR>")
index 4c914af0d5feea346273c7e7330e06c65ee6b7ca..28ac75e9833266fa03b6fd2273daf1e97984334d 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4805,
 /**/
     4804,
 /**/