]> granicus.if.org Git - vim/commitdiff
patch 7.4.2217 v7.4.2217
authorBram Moolenaar <Bram@vim.org>
Tue, 16 Aug 2016 14:08:18 +0000 (16:08 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 16 Aug 2016 14:08:18 +0000 (16:08 +0200)
Problem:    When using matchaddpos() a character after the end of the line can
            be highlighted.
Solution:   Only highlight existing characters. (Hirohito Higashi)

src/screen.c
src/structs.h
src/testdir/test_match.vim
src/version.c

index f0587e3af1777cafba08f9f8d72551f5297cef37..64e159af4a5918613cc08a0c2da8576bb5c146cf 100644 (file)
@@ -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;
     }
index 2a64471b1f57c8fd5e851e7d4b1fbbb2acc9fe18..4488bf860c2072d63f28ae5c5375a49315aeb981 100644 (file)
@@ -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
index 57dde19bab209aef895d0c2ef7acc7132eb45686..67f3ea737393ec115f16e7ae10b9e293215c5f16 100644 (file)
@@ -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
index 60d63d0a5fa95d6d209f528d703b5052023070b8..fc9a880e80fd7516e453b46bf228ac1ec7126a27 100644 (file)
@@ -763,6 +763,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2217,
 /**/
     2216,
 /**/