summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-08-16 16:08:18 +0200
committerBram Moolenaar <Bram@vim.org>2016-08-16 16:08:18 +0200
commit4f416e41243ca151b95d39d81ce23d00b1484755 (patch)
tree2e560a4c537b04744dff89b978a4842963f52a68 /src
parent22177f0c0826e3b2411a5e9d050b50200877ecd3 (diff)
patch 7.4.2217v7.4.2217
Problem: When using matchaddpos() a character after the end of the line can be highlighted. Solution: Only highlight existing characters. (Hirohito Higashi)
Diffstat (limited to 'src')
-rw-r--r--src/screen.c9
-rw-r--r--src/structs.h2
-rw-r--r--src/testdir/test_match.vim26
-rw-r--r--src/version.c2
4 files changed, 35 insertions, 4 deletions
diff --git a/src/screen.c b/src/screen.c
index f0587e3af1..64e159af4a 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -3542,6 +3542,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;
@@ -5125,14 +5126,14 @@ win_line(
* needed when a '$' was displayed for 'list'. */
#ifdef FEAT_SEARCH_EXTRA
prevcol_hl_flag = FALSE;
- if (prevcol == (long)search_hl.startcol)
+ 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)
+ if (!cur->hl.is_addpos && prevcol == (long)cur->hl.startcol)
{
prevcol_hl_flag = TRUE;
break;
@@ -5207,7 +5208,8 @@ win_line(
}
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)
cur = cur->next;
@@ -7815,6 +7817,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;
}
diff --git a/src/structs.h b/src/structs.h
index 2a64471b1f..4488bf860c 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -2439,6 +2439,8 @@ 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
+ matchaddpos(). TRUE/FALSE */
#ifdef FEAT_RELTIME
proftime_T tm; /* for a time limit */
#endif
diff --git a/src/testdir/test_match.vim b/src/testdir/test_match.vim
index 57dde19bab..67f3ea7373 100644
--- a/src/testdir/test_match.vim
+++ b/src/testdir/test_match.vim
@@ -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
diff --git a/src/version.c b/src/version.c
index 60d63d0a5f..fc9a880e80 100644
--- a/src/version.c
+++ b/src/version.c
@@ -764,6 +764,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2217,
+/**/
2216,
/**/
2215,