Hi Bram and list,

This is a proposal.

matchadd() and /\n can highlight end of line.
Currently, matchaddpos() can do this too.

I think, matchaddpos() should not do this.
Because this function specified position directory by user, it should be only 
to highlight certain parts of the *character*.


How to reproduce:
- Naked Vim with some options.
  $ vim -Nu NONE -i NONE -c "syntax on" -c "set hls" -c "call setline(1, 
'12345')"
- Highlight line:1,col:2 and line:1,col:6
  :echo matchaddpos('Error', [[1,2], [1,6]])

The behavior I want:
- Highlighted line:1,col:2, and not highlight line:1,col:6

Actual behavior:
- Highlighted both.


I wrote a patch with a test.
Please consider this proposal.
--
Best regards,
Hirohito Higashi (a.k.a. h_east)

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.
diff --git a/src/screen.c b/src/screen.c
index f8d283f..0b56a78 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -3557,6 +3557,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;
@@ -5140,14 +5141,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;
@@ -5222,7 +5223,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;
@@ -7830,6 +7832,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 5439748..82154de 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -2435,6 +2435,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 57dde19..67f3ea7 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

Raspunde prin e-mail lui