aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-04-23 19:51:32 +0800
committerGitHub <noreply@github.com>2022-04-23 19:51:32 +0800
commita98cf154ed9a05f3a2bdfa6e354547c954d2f052 (patch)
tree9454df69215492ed28acb667022928e56344b0bf
parent4e4914ab2e523f100c06fc5fb253f8625cc67232 (diff)
parent79ab277011e4668e2a6368be8ed908dc572af80f (diff)
downloadrneovim-a98cf154ed9a05f3a2bdfa6e354547c954d2f052.tar.gz
rneovim-a98cf154ed9a05f3a2bdfa6e354547c954d2f052.tar.bz2
rneovim-a98cf154ed9a05f3a2bdfa6e354547c954d2f052.zip
Merge pull request #18226 from zeertzjq/vim-8.2.4805
vim-patch:8.2.{4805,4812}: CurSearch used for all matches in current line
-rw-r--r--src/nvim/buffer_defs.h1
-rw-r--r--src/nvim/match.c36
-rw-r--r--src/nvim/testdir/test_search.vim11
-rw-r--r--test/functional/ui/searchhl_spec.lua27
4 files changed, 56 insertions, 19 deletions
diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h
index c16a9c0282..0a1c92a9a4 100644
--- a/src/nvim/buffer_defs.h
+++ b/src/nvim/buffer_defs.h
@@ -1020,7 +1020,6 @@ typedef struct {
// match (may continue in next line)
buf_T *buf; // the buffer to search for a match
linenr_T lnum; // the line to search for a match
- linenr_T lines; // number of lines starting from lnum
int attr; // attributes to be used for a match
int attr_cur; // attributes currently active in win_line()
linenr_T first_lnum; // first lnum to search for multi-line pat
diff --git a/src/nvim/match.c b/src/nvim/match.c
index f6d2fe13c4..ed320eb6fc 100644
--- a/src/nvim/match.c
+++ b/src/nvim/match.c
@@ -560,6 +560,22 @@ void 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)
+{
+ linenr_T linecount = shl->rm.endpos[0].lnum - shl->rm.startpos[0].lnum;
+
+ if (wp->w_cursor.lnum >= shl->lnum
+ && wp->w_cursor.lnum <= shl->lnum + linecount
+ && (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.
@@ -583,7 +599,6 @@ bool prepare_search_hl_line(win_T *wp, linenr_T lnum, colnr_T mincol, char_u **l
}
shl->startcol = MAXCOL;
shl->endcol = MAXCOL;
- shl->lines = 0;
shl->attr_cur = 0;
shl->is_addpos = false;
shl->has_cursor = false;
@@ -609,20 +624,10 @@ bool prepare_search_hl_line(win_T *wp, linenr_T lnum, colnr_T mincol, char_u **l
} 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 = 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.
@@ -723,6 +728,11 @@ int update_search_hl(win_T *wp, linenr_T lnum, colnr_T col, char_u **line, match
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 it
shl->endcol += utfc_ptr2len(*line + shl->endcol);
diff --git a/src/nvim/testdir/test_search.vim b/src/nvim/testdir/test_search.vim
index 24ecc58281..d359e69f91 100644
--- a/src/nvim/testdir/test_search.vim
+++ b/src/nvim/testdir/test_search.vim
@@ -951,7 +951,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
@@ -964,7 +964,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/test/functional/ui/searchhl_spec.lua b/test/functional/ui/searchhl_spec.lua
index 84dc3c59bb..56ff8a4101 100644
--- a/test/functional/ui/searchhl_spec.lua
+++ b/test/functional/ui/searchhl_spec.lua
@@ -163,15 +163,25 @@ describe('search highlighting', function()
end)
it('works for multiline match', function()
- command([[call setline(1, ['one', 'foo', 'bar', 'baz', 'foo', 'bar'])]])
+ command([[call setline(1, ['one', 'foo', 'bar', 'baz', 'foo the foo and foo', 'bar'])]])
feed('gg/foo<CR>')
screen:expect([[
one |
{2:^foo} |
bar |
baz |
+ {1:foo} the {1:foo} and {1:foo} |
+ bar |
+ /foo |
+ ]])
+ feed('n')
+ screen:expect([[
+ one |
{1:foo} |
bar |
+ baz |
+ {2:^foo} the {1:foo} and {1:foo} |
+ bar |
/foo |
]])
feed('n')
@@ -180,11 +190,22 @@ describe('search highlighting', function()
{1:foo} |
bar |
baz |
- {2:^foo} |
+ {1:foo} the {2:^foo} and {1:foo} |
+ bar |
+ /foo |
+ ]])
+ feed('n')
+ screen:expect([[
+ one |
+ {1:foo} |
+ bar |
+ baz |
+ {1:foo} the {1:foo} and {2:^foo} |
bar |
/foo |
]])
- feed('?<CR>')
+ command([[call setline(5, 'foo')]])
+ feed('0?<CR>')
screen:expect([[
one |
{2:^foo} |