changeset 10287:1c1fcf515607 v8.0.0040

commit https://github.com/vim/vim/commit/8507747600bddfd6a68aed057840856bf5548e61 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Oct 16 14:35:48 2016 +0200 patch 8.0.0040 Problem: Whole line highlighting with matchaddpos() does not work. Solution: Check for zero length. (Hirohito Higashi)
author Christian Brabandt <cb@256bit.org>
date Sun, 16 Oct 2016 14:45:04 +0200
parents 804761fded93
children aef7866360ed
files src/screen.c src/testdir/test_match.vim src/version.c
diffstat 3 files changed, 37 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/src/screen.c
+++ b/src/screen.c
@@ -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;
-
-    shl->lnum = 0;
+    int	    found = -1;
+
     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)
-	    {
-		/* partially sort positions by column numbers
-		 * on the same line */
-		if (pos->col < posmatch->pos[bot].col)
+	    if (found >= 0)
+	    {
+		/* 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)
-    {
-	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;
-
+    if (found >= 0)
+    {
+	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;
-    }
-    return FALSE;
+	posmatch->cur = found + 1;
+	return 1;
+    }
+    return 0;
 }
 #endif
 
--- a/src/testdir/test_match.vim
+++ b/src/testdir/test_match.vim
@@ -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
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    40,
+/**/
     39,
 /**/
     38,