Merge pull request #18209 from zeertzjq/vim-8.2.4759

vim-patch:8.2.4759: CurSearch highlight does not work for multi-line match
This commit is contained in:
zeertzjq 2022-04-21 20:44:15 +08:00 committed by GitHub
commit af5a7a0582
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 88 additions and 54 deletions

View File

@ -1027,6 +1027,7 @@ typedef struct {
colnr_T startcol; // in win_line() points to char where HL starts colnr_T startcol; // in win_line() points to char where HL starts
colnr_T endcol; // in win_line() points to char where HL ends colnr_T endcol; // in win_line() points to char where HL ends
bool is_addpos; // position specified directly by matchaddpos() bool is_addpos; // position specified directly by matchaddpos()
bool has_cursor; // true if the cursor is inside the match, used for CurSearch
proftime_T tm; // for a time limit proftime_T tm; // for a time limit
} match_T; } match_T;

View File

@ -373,6 +373,7 @@ static int next_search_hl_pos(match_T *shl, linenr_T lnum, posmatch_T *posmatch,
shl->rm.endpos[0].lnum = 0; shl->rm.endpos[0].lnum = 0;
shl->rm.endpos[0].col = end; shl->rm.endpos[0].col = end;
shl->is_addpos = true; shl->is_addpos = true;
shl->has_cursor = false;
posmatch->cur = found + 1; posmatch->cur = found + 1;
return 1; return 1;
} }
@ -585,6 +586,7 @@ bool prepare_search_hl_line(win_T *wp, linenr_T lnum, colnr_T mincol, char_u **l
shl->lines = 0; shl->lines = 0;
shl->attr_cur = 0; shl->attr_cur = 0;
shl->is_addpos = false; shl->is_addpos = false;
shl->has_cursor = false;
if (cur != NULL) { if (cur != NULL) {
cur->pos.cur = 0; cur->pos.cur = 0;
} }
@ -612,6 +614,17 @@ bool prepare_search_hl_line(win_T *wp, linenr_T lnum, colnr_T mincol, char_u **l
} else { } else {
shl->lines = 1; 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. // Highlight one character for an empty match.
if (shl->startcol == shl->endcol) { if (shl->startcol == shl->endcol) {
if ((*line)[shl->endcol] != NUL) { if ((*line)[shl->endcol] != NUL) {
@ -676,12 +689,7 @@ int update_search_hl(win_T *wp, linenr_T lnum, colnr_T col, char_u **line, match
} }
// Highlight the match were the cursor is using the CurSearch // Highlight the match were the cursor is using the CurSearch
// group. // group.
if (shl == search_hl if (shl == search_hl && shl->has_cursor && (HL_ATTR(HLF_LC) || wp->w_hl_ids[HLF_LC])) {
&& (HL_ATTR(HLF_LC) || wp->w_hl_ids[HLF_LC])
&& wp->w_cursor.lnum == lnum
&& wp->w_cursor.lnum < shl->lnum + shl->lines
&& wp->w_cursor.col >= shl->startcol
&& wp->w_cursor.col < shl->endcol) {
shl->attr_cur = win_hl_attr(wp, HLF_LC) ? win_hl_attr(wp, HLF_LC) : HL_ATTR(HLF_LC); shl->attr_cur = win_hl_attr(wp, HLF_LC) ? win_hl_attr(wp, HLF_LC) : HL_ATTR(HLF_LC);
} else { } else {
shl->attr_cur = shl->attr; shl->attr_cur = shl->attr;

View File

@ -968,7 +968,17 @@ func Test_hlsearch_cursearch()
call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_single_line_3', {}) call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_single_line_3', {})
call term_sendkeys(buf, "gg/foo\\nbar\<CR>") 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 StopVimInTerminal(buf)
call delete('Xhlsearch_cursearch') call delete('Xhlsearch_cursearch')

View File

@ -163,53 +163,68 @@ describe('search highlighting', function()
end) end)
it('works for multiline match', function() it('works for multiline match', function()
insert([[ command([[call setline(1, ['one', 'foo', 'bar', 'baz', 'foo', 'bar'])]])
one feed('gg/foo<CR>')
foo screen:expect([[
bar one |
baz {2:^foo} |
foo bar |
bar]]) baz |
feed('gg/foo<CR>') {1:foo} |
screen:expect([[ bar |
one | /foo |
{2:^foo} | ]])
bar | feed('n')
baz | screen:expect([[
{1:foo} | one |
bar | {1:foo} |
/foo | bar |
]]) baz |
feed('n') {2:^foo} |
screen:expect([[ bar |
one | /foo |
{1:foo} | ]])
bar | feed('?<CR>')
baz | screen:expect([[
{2:^foo} | one |
bar | {2:^foo} |
/foo | bar |
]]) baz |
feed('?<CR>') {1:foo} |
screen:expect([[ bar |
one | ?foo |
{2:^foo} | ]])
bar | feed('gg/foo\\nbar<CR>')
baz | screen:expect([[
{1:foo} | one |
bar | {2:^foo} |
?foo | {2:bar} |
]]) baz |
feed('gg/foo\\nbar<CR>') {1:foo} |
screen:expect([[ {1:bar} |
one | /foo\nbar |
{2:^foo} | ]])
{1:bar} | command([[call setline(1, ['---', 'abcdefg', 'hijkl', '---', 'abcdefg', 'hijkl'])]])
baz | feed('gg/efg\\nhij<CR>')
{1:foo} | screen:expect([[
{1:bar} | --- |
/foo\nbar | abcd{2:^efg} |
]]) {2:hij}kl |
--- |
abcd{1:efg} |
{1:hij}kl |
/efg\nhij |
]])
feed('n')
screen:expect([[
--- |
abcd{1:efg} |
{1:hij}kl |
--- |
abcd{2:^efg} |
{2:hij}kl |
/efg\nhij |
]])
end) end)
end) end)