diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-04-22 20:07:21 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-04-22 20:07:21 +0100 |
commit | 9b36750640e8e89f18afa1446ed80fdbdf0fcac0 (patch) | |
tree | 6818ffda6b19cef92dc7d5f06e3ac81c5c961b71 | |
parent | 1fc6ea9bf3548b578676331f5eac1f7e0611c268 (diff) | |
download | vim-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.c | 39 | ||||
-rw-r--r-- | src/testdir/dumps/Test_hlsearch_cursearch_single_line_1.dump | 2 | ||||
-rw-r--r-- | src/testdir/dumps/Test_hlsearch_cursearch_single_line_2.dump | 2 | ||||
-rw-r--r-- | src/testdir/dumps/Test_hlsearch_cursearch_single_line_2a.dump | 9 | ||||
-rw-r--r-- | src/testdir/dumps/Test_hlsearch_cursearch_single_line_2b.dump | 9 | ||||
-rw-r--r-- | src/testdir/test_search.vim | 11 | ||||
-rw-r--r-- | src/version.c | 2 |
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࿈ff13|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࿈ff13|o@1| +0&#ffffff0@56 +>f+0࿈ff13|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࿈ff13|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࿈ff13|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, |