aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Ennen <mike.ennen@gmail.com>2016-12-06 22:56:14 -0700
committerMichael Ennen <mike.ennen@gmail.com>2016-12-07 00:37:29 -0700
commit63c46c11062f5c720644d9bb419f42b0a6d837c8 (patch)
tree69627c4db95b1da1b1ff43747b5fcfd169acdc3c
parent0e99d291699dc5548f891340a4abb1541041b854 (diff)
downloadrneovim-63c46c11062f5c720644d9bb419f42b0a6d837c8.tar.gz
rneovim-63c46c11062f5c720644d9bb419f42b0a6d837c8.tar.bz2
rneovim-63c46c11062f5c720644d9bb419f42b0a6d837c8.zip
vim-patch:8.0.0040
Problem: Whole line highlighting with matchaddpos() does not work. Solution: Check for zero length. (Hirohito Higashi) https://github.com/vim/vim/commit/8507747600bddfd6a68aed057840856bf5548e61
-rw-r--r--src/nvim/buffer_defs.h14
-rw-r--r--src/nvim/screen.c38
-rw-r--r--src/nvim/testdir/test_match.vim8
3 files changed, 35 insertions, 25 deletions
diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h
index 1de74e089e..2f0e8ad974 100644
--- a/src/nvim/buffer_defs.h
+++ b/src/nvim/buffer_defs.h
@@ -877,13 +877,13 @@ struct frame_S {
* match functions there is a different pattern for each window.
*/
typedef struct {
- regmmatch_T rm; /* points to the regexp program; contains last found
- match (may continue in next line) */
- buf_T *buf; /* the buffer to search for a match */
- linenr_T lnum; /* the line to search for a match */
- int attr; /* attributes to be used for a match */
- int attr_cur; /* attributes currently active in win_line() */
- linenr_T first_lnum; /* first lnum to search for multi-line pat */
+ regmmatch_T rm; // points to the regexp program; contains last found
+ // match (may continue in next line)
+ buf_T *buf; // the buffer to search for a match
+ linenr_T lnum; // the line to search for a match
+ int attr; // attributes to be used for a match
+ int attr_cur; // attributes currently active in win_line()
+ 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
bool is_addpos; // position specified directly by matchaddpos()
diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index ac8d14efb1..50517d2829 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -5698,6 +5698,8 @@ 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
@@ -5707,7 +5709,7 @@ next_search_hl_pos(
)
{
int i;
- int bot = -1;
+ int found = -1;
shl->lnum = 0;
for (i = posmatch->cur; i < MAXPOSMATCH; i++) {
@@ -5716,41 +5718,41 @@ next_search_hl_pos(
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 (bot != -1) {
- // 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 (bot != -1) {
- 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;
+ posmatch->cur = found + 1;
+ return 1;
}
- return false;
+ return 0;
}
static void screen_start_highlight(int attr)
diff --git a/src/nvim/testdir/test_match.vim b/src/nvim/testdir/test_match.vim
index d176bf9a87..7748dee87f 100644
--- a/src/nvim/testdir/test_match.vim
+++ b/src/nvim/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