]> granicus.if.org Git - vim/commitdiff
patch 8.0.0040 v8.0.0040
authorBram Moolenaar <Bram@vim.org>
Sun, 16 Oct 2016 12:35:48 +0000 (14:35 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 16 Oct 2016 12:35:48 +0000 (14:35 +0200)
Problem:    Whole line highlighting with matchaddpos() does not work.
Solution:   Check for zero length. (Hirohito Higashi)

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

index 0889db91d61cbbae6355d99d48c936582f55f59d..78f89ebf6a6ff2fdb2bf87d725b63c17ae395ae1 100644 (file)
@@ -7773,6 +7773,10 @@ next_search_hl(
     }
 }
 
+/*
+ * If there is a match fill "shl" and return one.
+ * Return zero otherwise.
+ */
     static int
 next_search_hl_pos(
     match_T        *shl,       /* points to a match */
@@ -7781,55 +7785,52 @@ next_search_hl_pos(
     colnr_T        mincol)     /* minimal column for a match */
 {
     int            i;
-    int            bot = -1;
+    int            found = -1;
 
-    shl->lnum = 0;
     for (i = posmatch->cur; i < MAXPOSMATCH; i++)
     {
        llpos_T *pos = &posmatch->pos[i];
 
        if (pos->lnum == 0)
            break;
-       if (pos->col + pos->len - 1 <= mincol)
+       if (pos->len == 0 && pos->col < mincol)
            continue;
        if (pos->lnum == lnum)
        {
-           if (shl->lnum == lnum)
+           if (found >= 0)
            {
-               /* partially sort positions by column numbers
-                * on the same line */
-               if (pos->col < posmatch->pos[bot].col)
+               /* if this match comes before the one at "found" then swap
+                * them */
+               if (pos->col < posmatch->pos[found].col)
                {
                    llpos_T     tmp = *pos;
 
-                   *pos = posmatch->pos[bot];
-                   posmatch->pos[bot] = tmp;
+                   *pos = posmatch->pos[found];
+                   posmatch->pos[found] = tmp;
                }
            }
            else
-           {
-               bot = i;
-               shl->lnum = lnum;
-           }
+               found = i;
        }
     }
     posmatch->cur = 0;
-    if (shl->lnum == lnum && bot >= 0)
+    if (found >= 0)
     {
-       colnr_T start = posmatch->pos[bot].col == 0
-                                            ? 0 : posmatch->pos[bot].col - 1;
-       colnr_T end = posmatch->pos[bot].col == 0
-                                   ? MAXCOL : start + posmatch->pos[bot].len;
+       colnr_T start = posmatch->pos[found].col == 0
+                                           ? 0 : posmatch->pos[found].col - 1;
+       colnr_T end = posmatch->pos[found].col == 0
+                                  ? MAXCOL : start + posmatch->pos[found].len;
 
+       shl->lnum = lnum;
        shl->rm.startpos[0].lnum = 0;
        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;
+       posmatch->cur = found + 1;
+       return 1;
     }
-    return FALSE;
+    return 0;
 }
 #endif
 
index 3b20d5d439021e09af6fef9027c7fac1931d77d2..9398ef2f2729aa60b4485676cee569e245a703cd 100644 (file)
@@ -191,7 +191,15 @@ func Test_matchaddpos()
   call assert_equal(screenattr(2,2), screenattr(1,7))
   call assert_notequal(screenattr(2,2), screenattr(1,8))
 
+  call clearmatches()
+  call matchaddpos('Error', [[1], [2,2]])
+  redraw!
+  call assert_equal(screenattr(2,2), screenattr(1,1))
+  call assert_equal(screenattr(2,2), screenattr(1,10))
+  call assert_notequal(screenattr(2,2), screenattr(1,11))
+
   nohl
+  call clearmatches()
   syntax off
   set hlsearch&
 endfunc
index 2bfd48507ba3b3894785a33104ed28a33eeec4cb..e6f8f47821354953fb580fa2d134260fd71b0c18 100644 (file)
@@ -764,6 +764,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    40,
 /**/
     39,
 /**/