diff options
-rw-r--r-- | src/nvim/buffer_defs.h | 14 | ||||
-rw-r--r-- | src/nvim/screen.c | 38 | ||||
-rw-r--r-- | src/nvim/testdir/test_match.vim | 8 |
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 |