summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-04-22 20:07:21 +0100
committerBram Moolenaar <Bram@vim.org>2022-04-22 20:07:21 +0100
commit9b36750640e8e89f18afa1446ed80fdbdf0fcac0 (patch)
tree6818ffda6b19cef92dc7d5f06e3ac81c5c961b71
parent1fc6ea9bf3548b578676331f5eac1f7e0611c268 (diff)
downloadvim-git-9b36750640e8e89f18afa1446ed80fdbdf0fcac0.tar.gz
patch 8.2.4805: CurSearch used for all matches in current linev8.2.4805
Problem: CurSearch used for all matches in current line. Solution: Don't use the non-zero line count. (closes #10247)
-rw-r--r--src/match.c39
-rw-r--r--src/testdir/dumps/Test_hlsearch_cursearch_single_line_1.dump2
-rw-r--r--src/testdir/dumps/Test_hlsearch_cursearch_single_line_2.dump2
-rw-r--r--src/testdir/dumps/Test_hlsearch_cursearch_single_line_2a.dump9
-rw-r--r--src/testdir/dumps/Test_hlsearch_cursearch_single_line_2b.dump9
-rw-r--r--src/testdir/test_search.vim11
-rw-r--r--src/version.c2
7 files changed, 59 insertions, 15 deletions
diff --git a/src/match.c b/src/match.c
index 9edba8d99..fb130ae4f 100644
--- a/src/match.c
+++ b/src/match.c
@@ -618,6 +618,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
* current highlight attribute.
@@ -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
diff --git a/src/testdir/dumps/Test_hlsearch_cursearch_single_line_1.dump b/src/testdir/dumps/Test_hlsearch_cursearch_single_line_1.dump
index ef2922f87..ab726651a 100644
--- a/src/testdir/dumps/Test_hlsearch_cursearch_single_line_1.dump
+++ b/src/testdir/dumps/Test_hlsearch_cursearch_single_line_1.dump
@@ -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
diff --git a/src/testdir/dumps/Test_hlsearch_cursearch_single_line_2.dump b/src/testdir/dumps/Test_hlsearch_cursearch_single_line_2.dump
index 26e03e0a7..dd4aa8951 100644
--- a/src/testdir/dumps/Test_hlsearch_cursearch_single_line_2.dump
+++ b/src/testdir/dumps/Test_hlsearch_cursearch_single_line_2.dump
@@ -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
index 000000000..2cc3c1737
--- /dev/null
+++ b/src/testdir/dumps/Test_hlsearch_cursearch_single_line_2a.dump
@@ -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
index 000000000..0b20bd589
--- /dev/null
+++ b/src/testdir/dumps/Test_hlsearch_cursearch_single_line_2b.dump
@@ -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|
diff --git a/src/testdir/test_search.vim b/src/testdir/test_search.vim
index 97ddfdbc6..2a767c0c3 100644
--- a/src/testdir/test_search.vim
+++ b/src/testdir/test_search.vim
@@ -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>")
diff --git a/src/version.c b/src/version.c
index 4c914af0d..28ac75e98 100644
--- 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 */
/**/
+ 4805,
+/**/
4804,
/**/
4803,