mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:7.4.2217
Problem: When using matchaddpos() a character after the end of the line can
be highlighted.
Solution: Only highlight existing characters. (Hirohito Higashi)
4f416e4124
This commit is contained in:
parent
629e788b36
commit
0064e9738a
@ -885,8 +885,9 @@ typedef struct {
|
||||
int attr_cur; /* attributes currently active in win_line() */
|
||||
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 */
|
||||
proftime_T tm; /* for a time limit */
|
||||
colnr_T endcol; // in win_line() points to char where HL ends
|
||||
bool is_addpos; // position specified directly by matchaddpos()
|
||||
proftime_T tm; // for a time limit
|
||||
} match_T;
|
||||
|
||||
/// number of positions supported by matchaddpos()
|
||||
|
@ -2592,6 +2592,7 @@ win_line (
|
||||
shl->startcol = MAXCOL;
|
||||
shl->endcol = MAXCOL;
|
||||
shl->attr_cur = 0;
|
||||
shl->is_addpos = false;
|
||||
v = (long)(ptr - line);
|
||||
if (cur != NULL) {
|
||||
cur->pos.cur = 0;
|
||||
@ -3760,18 +3761,18 @@ win_line (
|
||||
if ((long)(wp->w_p_wrap ? wp->w_skipcol : wp->w_leftcol) > prevcol)
|
||||
++prevcol;
|
||||
|
||||
/* Invert at least one char, used for Visual and empty line or
|
||||
* highlight match at end of line. If it's beyond the last
|
||||
* char on the screen, just overwrite that one (tricky!) Not
|
||||
* needed when a '$' was displayed for 'list'. */
|
||||
prevcol_hl_flag = FALSE;
|
||||
if (prevcol == (long)search_hl.startcol)
|
||||
prevcol_hl_flag = TRUE;
|
||||
else {
|
||||
// Invert at least one char, used for Visual and empty line or
|
||||
// highlight match at end of line. If it's beyond the last
|
||||
// char on the screen, just overwrite that one (tricky!) Not
|
||||
// needed when a '$' was displayed for 'list'.
|
||||
prevcol_hl_flag = false;
|
||||
if (!search_hl.is_addpos && prevcol == (long)search_hl.startcol) {
|
||||
prevcol_hl_flag = true;
|
||||
} else {
|
||||
cur = wp->w_match_head;
|
||||
while (cur != NULL) {
|
||||
if (prevcol == (long)cur->hl.startcol) {
|
||||
prevcol_hl_flag = TRUE;
|
||||
if (!cur->hl.is_addpos && prevcol == (long)cur->hl.startcol) {
|
||||
prevcol_hl_flag = true;
|
||||
break;
|
||||
}
|
||||
cur = cur->next;
|
||||
@ -3821,10 +3822,13 @@ win_line (
|
||||
shl_flag = TRUE;
|
||||
} else
|
||||
shl = &cur->hl;
|
||||
if ((ptr - line) - 1 == (long)shl->startcol)
|
||||
if ((ptr - line) - 1 == (long)shl->startcol
|
||||
&& (shl == &search_hl || !shl->is_addpos)) {
|
||||
char_attr = shl->attr;
|
||||
if (shl != &search_hl && cur != NULL)
|
||||
}
|
||||
if (shl != &search_hl && cur != NULL) {
|
||||
cur = cur->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
ScreenAttrs[off] = char_attr;
|
||||
@ -5737,6 +5741,7 @@ next_search_hl_pos(
|
||||
shl->rm.startpos[0].col = start;
|
||||
shl->rm.endpos[0].lnum = 0;
|
||||
shl->rm.endpos[0].col = end;
|
||||
shl->is_addpos = true;
|
||||
posmatch->cur = bot + 1;
|
||||
return true;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
" Test for :match, :2match, :3match, clearmatches(), getmatches(), matchadd(),
|
||||
" matchaddpos(), matcharg(), matchdelete(), matchstrpos() and setmatches().
|
||||
|
||||
function Test_matcharg()
|
||||
function Test_match()
|
||||
highlight MyGroup1 term=bold ctermbg=red guibg=red
|
||||
highlight MyGroup2 term=italic ctermbg=green guibg=green
|
||||
highlight MyGroup3 term=underline ctermbg=blue guibg=blue
|
||||
@ -162,4 +162,28 @@ func Test_matchstrpos()
|
||||
call assert_equal(['', -1, -1, -1], matchstrpos(['vim', 'testing', 'execute'], 'img'))
|
||||
endfunc
|
||||
|
||||
func Test_matchaddpos()
|
||||
syntax on
|
||||
set hlsearch
|
||||
|
||||
call setline(1, ['12345', 'NP'])
|
||||
call matchaddpos('Error', [[1,2], [1,6], [2,2]])
|
||||
redraw!
|
||||
call assert_notequal(screenattr(2,2), 0)
|
||||
call assert_equal(screenattr(2,2), screenattr(1,2))
|
||||
call assert_notequal(screenattr(2,2), screenattr(1,6))
|
||||
1
|
||||
call matchadd('Search', 'N\|\n')
|
||||
redraw!
|
||||
call assert_notequal(screenattr(2,1), 0)
|
||||
call assert_equal(screenattr(2,1), screenattr(1,6))
|
||||
exec "norm! i0\<Esc>"
|
||||
redraw!
|
||||
call assert_equal(screenattr(2,2), screenattr(1,6))
|
||||
|
||||
nohl
|
||||
syntax off
|
||||
set hlsearch&
|
||||
endfunc
|
||||
|
||||
" vim: et ts=2 sw=2
|
||||
|
@ -225,7 +225,7 @@ static int included_patches[] = {
|
||||
// 2220,
|
||||
2219,
|
||||
// 2218 NA
|
||||
// 2217,
|
||||
2217,
|
||||
// 2216 NA
|
||||
// 2215,
|
||||
// 2214 NA
|
||||
|
Loading…
Reference in New Issue
Block a user