mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 8.2.4759: CurSearch highlight does not work for multi-line match
Problem: CurSearch highlight does not work for multi-line match. Solution: Check cursor position before adjusting columns. (closes #10133)
This commit is contained in:
21
src/match.c
21
src/match.c
@@ -396,6 +396,7 @@ next_search_hl_pos(
|
||||
shl->rm.endpos[0].lnum = 0;
|
||||
shl->rm.endpos[0].col = end;
|
||||
shl->is_addpos = TRUE;
|
||||
shl->has_cursor = FALSE;
|
||||
posmatch->cur = found + 1;
|
||||
return 1;
|
||||
}
|
||||
@@ -655,6 +656,7 @@ prepare_search_hl_line(
|
||||
shl->lines = 0;
|
||||
shl->attr_cur = 0;
|
||||
shl->is_addpos = FALSE;
|
||||
shl->has_cursor = FALSE;
|
||||
if (cur != NULL)
|
||||
cur->pos.cur = 0;
|
||||
next_search_hl(wp, search_hl, shl, lnum, mincol,
|
||||
@@ -679,6 +681,17 @@ prepare_search_hl_line(
|
||||
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;
|
||||
|
||||
// Highlight one character for an empty match.
|
||||
if (shl->startcol == shl->endcol)
|
||||
{
|
||||
@@ -775,14 +788,8 @@ update_search_hl(
|
||||
# endif
|
||||
// Highlight the match were the cursor is using the CurSearch
|
||||
// group.
|
||||
if (shl == search_hl
|
||||
&& wp->w_cursor.lnum >= shl->lnum
|
||||
&& wp->w_cursor.lnum < shl->lnum + shl->lines
|
||||
&& wp->w_cursor.col >= shl->startcol
|
||||
&& wp->w_cursor.col < shl->endcol)
|
||||
{
|
||||
if (shl == search_hl && shl->has_cursor)
|
||||
shl->attr_cur = HL_ATTR(HLF_LC);
|
||||
}
|
||||
|
||||
}
|
||||
else if (col == shl->endcol)
|
||||
|
@@ -3337,8 +3337,10 @@ typedef struct
|
||||
linenr_T first_lnum; // first lnum to search for multi-line pat
|
||||
colnr_T startcol; // in win_line() points to char where HL starts
|
||||
colnr_T endcol; // in win_line() points to char where HL ends
|
||||
int is_addpos; // position specified directly by
|
||||
char is_addpos; // position specified directly by
|
||||
// matchaddpos(). TRUE/FALSE
|
||||
char has_cursor; // TRUE if the cursor is inside the match, used for
|
||||
// CurSearch
|
||||
#ifdef FEAT_RELTIME
|
||||
proftime_T tm; // for a time limit
|
||||
#endif
|
||||
|
@@ -0,0 +1,9 @@
|
||||
|-+0&#ffffff0@2| @56
|
||||
|a|b|c|d>e+0࿈ff13|f|g| | +0&#ffffff0@51
|
||||
|h+0࿈ff13|i|j|k+0&#ffffff0|l| @54
|
||||
|-@2| @56
|
||||
|a|b|c|d|e+0&#ffff4012|f|g| | +0&#ffffff0@51
|
||||
|h+0&#ffff4012|i|j|k+0&#ffffff0|l| @54
|
||||
|~+0#4040ff13&| @58
|
||||
|~| @58
|
||||
|/+0#0000000&|e|f|g|\|n|h|i|j| @32|2|,|5| @10|A|l@1|
|
@@ -0,0 +1,9 @@
|
||||
|-+0&#ffffff0@2| @56
|
||||
|a|b|c>d|e+0&#ffff4012|f|g| | +0&#ffffff0@51
|
||||
|h+0&#ffff4012|i|j|k+0&#ffffff0|l| @54
|
||||
|-@2| @56
|
||||
|a|b|c|d|e+0&#ffff4012|f|g| | +0&#ffffff0@51
|
||||
|h+0&#ffff4012|i|j|k+0&#ffffff0|l| @54
|
||||
|~+0#4040ff13&| @58
|
||||
|~| @58
|
||||
| +0#0000000&@41|2|,|4| @10|A|l@1|
|
@@ -0,0 +1,9 @@
|
||||
|-+0&#ffffff0@2| @56
|
||||
|a|b|c|d|e+0&#ffff4012|f|g| | +0&#ffffff0@51
|
||||
|h+0&#ffff4012|i|j>k+0&#ffffff0|l| @54
|
||||
|-@2| @56
|
||||
|a|b|c|d|e+0&#ffff4012|f|g| | +0&#ffffff0@51
|
||||
|h+0&#ffff4012|i|j|k+0&#ffffff0|l| @54
|
||||
|~+0#4040ff13&| @58
|
||||
|~| @58
|
||||
| +0#0000000&@41|3|,|4| @10|A|l@1|
|
@@ -0,0 +1,9 @@
|
||||
|-+0&#ffffff0@2| @56
|
||||
|a|b|c|d|e+0࿈ff13|f|g| | +0&#ffffff0@51
|
||||
|h+0࿈ff13|i>j|k+0&#ffffff0|l| @54
|
||||
|-@2| @56
|
||||
|a|b|c|d|e+0&#ffff4012|f|g| | +0&#ffffff0@51
|
||||
|h+0&#ffff4012|i|j|k+0&#ffffff0|l| @54
|
||||
|~+0#4040ff13&| @58
|
||||
|~| @58
|
||||
| +0#0000000&@41|3|,|3| @10|A|l@1|
|
@@ -1060,7 +1060,17 @@ func Test_hlsearch_cursearch()
|
||||
call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_single_line_3', {})
|
||||
|
||||
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 delete('Xhlsearch_cursearch')
|
||||
|
@@ -746,6 +746,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
4759,
|
||||
/**/
|
||||
4758,
|
||||
/**/
|
||||
|
Reference in New Issue
Block a user