forked from aniani/vim
patch 8.2.3698: match highlighting continues over breakindent
Problem: Match highlighting continues over breakindent. Solution: Stop before the end column. (closes #9242)
This commit is contained in:
@@ -434,6 +434,7 @@ win_line(
|
|||||||
|
|
||||||
#if defined(FEAT_CONCEAL) || defined(FEAT_SEARCH_EXTRA)
|
#if defined(FEAT_CONCEAL) || defined(FEAT_SEARCH_EXTRA)
|
||||||
int match_conc = 0; // cchar for match functions
|
int match_conc = 0; // cchar for match functions
|
||||||
|
int on_last_col = FALSE;
|
||||||
#endif
|
#endif
|
||||||
#ifdef FEAT_CONCEAL
|
#ifdef FEAT_CONCEAL
|
||||||
int syntax_flags = 0;
|
int syntax_flags = 0;
|
||||||
@@ -1382,7 +1383,8 @@ win_line(
|
|||||||
v = (long)(ptr - line);
|
v = (long)(ptr - line);
|
||||||
search_attr = update_search_hl(wp, lnum, (colnr_T)v, &line,
|
search_attr = update_search_hl(wp, lnum, (colnr_T)v, &line,
|
||||||
&screen_search_hl, &has_match_conc,
|
&screen_search_hl, &has_match_conc,
|
||||||
&match_conc, did_line_attr, lcs_eol_one);
|
&match_conc, did_line_attr, lcs_eol_one,
|
||||||
|
&on_last_col);
|
||||||
ptr = line + v; // "line" may have been changed
|
ptr = line + v; // "line" may have been changed
|
||||||
|
|
||||||
// Do not allow a conceal over EOL otherwise EOL will be missed
|
// Do not allow a conceal over EOL otherwise EOL will be missed
|
||||||
@@ -2012,6 +2014,10 @@ win_line(
|
|||||||
if (n_extra < 0)
|
if (n_extra < 0)
|
||||||
n_extra = 0;
|
n_extra = 0;
|
||||||
}
|
}
|
||||||
|
if (on_last_col)
|
||||||
|
// Do not continue search/match highlighting over the
|
||||||
|
// line break.
|
||||||
|
search_attr = 0;
|
||||||
|
|
||||||
if (c == TAB && n_extra + col > wp->w_width)
|
if (c == TAB && n_extra + col > wp->w_width)
|
||||||
# ifdef FEAT_VARTABS
|
# ifdef FEAT_VARTABS
|
||||||
|
|||||||
@@ -703,6 +703,8 @@ prepare_search_hl_line(
|
|||||||
* After end, check for start/end of next match.
|
* After end, check for start/end of next match.
|
||||||
* When another match, have to check for start again.
|
* When another match, have to check for start again.
|
||||||
* Watch out for matching an empty string!
|
* Watch out for matching an empty string!
|
||||||
|
* "on_last_col" is set to TRUE with non-zero search_attr and the next column
|
||||||
|
* is endcol.
|
||||||
* Return the updated search_attr.
|
* Return the updated search_attr.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
@@ -715,7 +717,8 @@ update_search_hl(
|
|||||||
int *has_match_conc UNUSED,
|
int *has_match_conc UNUSED,
|
||||||
int *match_conc UNUSED,
|
int *match_conc UNUSED,
|
||||||
int did_line_attr,
|
int did_line_attr,
|
||||||
int lcs_eol_one)
|
int lcs_eol_one,
|
||||||
|
int *on_last_col)
|
||||||
{
|
{
|
||||||
matchitem_T *cur; // points to the match list
|
matchitem_T *cur; // points to the match list
|
||||||
match_T *shl; // points to search_hl or a match
|
match_T *shl; // points to search_hl or a match
|
||||||
@@ -832,7 +835,10 @@ update_search_hl(
|
|||||||
else
|
else
|
||||||
shl = &cur->hl;
|
shl = &cur->hl;
|
||||||
if (shl->attr_cur != 0)
|
if (shl->attr_cur != 0)
|
||||||
|
{
|
||||||
search_attr = shl->attr_cur;
|
search_attr = shl->attr_cur;
|
||||||
|
*on_last_col = col + 1 >= shl->endcol;
|
||||||
|
}
|
||||||
if (shl != search_hl && cur != NULL)
|
if (shl != search_hl && cur != NULL)
|
||||||
cur = cur->next;
|
cur = cur->next;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ void clear_matches(win_T *wp);
|
|||||||
void init_search_hl(win_T *wp, match_T *search_hl);
|
void init_search_hl(win_T *wp, match_T *search_hl);
|
||||||
void prepare_search_hl(win_T *wp, match_T *search_hl, linenr_T lnum);
|
void prepare_search_hl(win_T *wp, match_T *search_hl, linenr_T lnum);
|
||||||
int prepare_search_hl_line(win_T *wp, linenr_T lnum, colnr_T mincol, char_u **line, match_T *search_hl, int *search_attr);
|
int prepare_search_hl_line(win_T *wp, linenr_T lnum, colnr_T mincol, char_u **line, match_T *search_hl, int *search_attr);
|
||||||
int update_search_hl(win_T *wp, linenr_T lnum, colnr_T col, char_u **line, match_T *search_hl, int *has_match_conc, int *match_conc, int did_line_attr, int lcs_eol_one);
|
int update_search_hl(win_T *wp, linenr_T lnum, colnr_T col, char_u **line, match_T *search_hl, int *has_match_conc, int *match_conc, int did_line_attr, int lcs_eol_one, int *on_last_col);
|
||||||
int get_prevcol_hl_flag(win_T *wp, match_T *search_hl, long curcol);
|
int get_prevcol_hl_flag(win_T *wp, match_T *search_hl, long curcol);
|
||||||
void get_search_match_hl(win_T *wp, match_T *search_hl, long col, int *char_attr);
|
void get_search_match_hl(win_T *wp, match_T *search_hl, long col, int *char_attr);
|
||||||
void f_clearmatches(typval_T *argvars, typval_T *rettv);
|
void f_clearmatches(typval_T *argvars, typval_T *rettv);
|
||||||
|
|||||||
10
src/testdir/dumps/Test_match_linebreak.dump
Normal file
10
src/testdir/dumps/Test_match_linebreak.dump
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
>x+0&#ffffff0@49|]+0#ffffff16#e000002| +0#0000000#ffffff0@23
|
||||||
|
|x@69| @4
|
||||||
|
|~+0#4040ff13&| @73
|
||||||
|
|~| @73
|
||||||
|
|~| @73
|
||||||
|
|~| @73
|
||||||
|
|~| @73
|
||||||
|
|~| @73
|
||||||
|
|~| @73
|
||||||
|
| +0#0000000&@56|1|,|1| @10|A|l@1|
|
||||||
@@ -349,6 +349,23 @@ func Test_matchadd_other_window()
|
|||||||
call delete('XscriptMatchCommon')
|
call delete('XscriptMatchCommon')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_match_in_linebreak()
|
||||||
|
CheckRunVimInTerminal
|
||||||
|
|
||||||
|
let lines =<< trim END
|
||||||
|
set breakindent linebreak breakat+=]
|
||||||
|
call printf('%s]%s', repeat('x', 50), repeat('x', 70))->setline(1)
|
||||||
|
call matchaddpos('ErrorMsg', [[1, 51]])
|
||||||
|
END
|
||||||
|
call writefile(lines, 'XscriptMatchLinebreak')
|
||||||
|
let buf = RunVimInTerminal('-S XscriptMatchLinebreak', #{rows: 10})
|
||||||
|
call TermWait(buf)
|
||||||
|
call VerifyScreenDump(buf, 'Test_match_linebreak', {})
|
||||||
|
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
|
call delete('XscriptMatchLinebreak')
|
||||||
|
endfunc
|
||||||
|
|
||||||
" Test for deleting matches outside of the screen redraw top/bottom lines
|
" Test for deleting matches outside of the screen redraw top/bottom lines
|
||||||
" This should cause a redraw of those lines.
|
" This should cause a redraw of those lines.
|
||||||
func Test_matchdelete_redraw()
|
func Test_matchdelete_redraw()
|
||||||
|
|||||||
@@ -757,6 +757,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
3698,
|
||||||
/**/
|
/**/
|
||||||
3697,
|
3697,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
Reference in New Issue
Block a user