diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/buffer_defs.h | 1 | ||||
-rw-r--r-- | src/nvim/match.c | 36 | ||||
-rw-r--r-- | src/nvim/testdir/test_search.vim | 11 |
3 files changed, 32 insertions, 16 deletions
diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h index c16a9c0282..0a1c92a9a4 100644 --- a/src/nvim/buffer_defs.h +++ b/src/nvim/buffer_defs.h @@ -1020,7 +1020,6 @@ typedef struct { // 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 - linenr_T lines; // number of lines starting from lnum 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 diff --git a/src/nvim/match.c b/src/nvim/match.c index f6d2fe13c4..ed320eb6fc 100644 --- a/src/nvim/match.c +++ b/src/nvim/match.c @@ -560,6 +560,22 @@ void prepare_search_hl(win_T *wp, match_T *search_hl, linenr_T lnum) } } +/// Update "shl->has_cursor" based on the match in "shl" and the cursor +/// position. +static void check_cur_search_hl(win_T *wp, match_T *shl) +{ + linenr_T linecount = shl->rm.endpos[0].lnum - shl->rm.startpos[0].lnum; + + if (wp->w_cursor.lnum >= shl->lnum + && wp->w_cursor.lnum <= shl->lnum + linecount + && (wp->w_cursor.lnum > shl->lnum || wp->w_cursor.col >= shl->rm.startpos[0].col) + && (wp->w_cursor.lnum < shl->lnum + linecount || wp->w_cursor.col < shl->rm.endpos[0].col)) { + shl->has_cursor = true; + } else { + shl->has_cursor = false; + } +} + /// Prepare for 'hlsearch' and match highlighting in one window line. /// Return true if there is such highlighting and set "search_attr" to the /// current highlight attribute. @@ -583,7 +599,6 @@ bool prepare_search_hl_line(win_T *wp, linenr_T lnum, colnr_T mincol, char_u **l } shl->startcol = MAXCOL; shl->endcol = MAXCOL; - shl->lines = 0; shl->attr_cur = 0; shl->is_addpos = false; shl->has_cursor = false; @@ -609,20 +624,10 @@ bool prepare_search_hl_line(win_T *wp, linenr_T lnum, colnr_T mincol, char_u **l } else { shl->endcol = MAXCOL; } - if (shl->rm.endpos[0].lnum != shl->rm.startpos[0].lnum) { - shl->lines = shl->rm.endpos[0].lnum - shl->rm.startpos[0].lnum; - } else { - shl->lines = 1; - } // check if the cursor is in the match before changing the columns - if (wp->w_cursor.lnum >= shl->lnum - && wp->w_cursor.lnum <= shl->lnum + shl->rm.endpos[0].lnum - && (wp->w_cursor.lnum > shl->lnum - || wp->w_cursor.col >= shl->rm.startpos[0].col) - && (wp->w_cursor.lnum < shl->lnum + shl->lines - || wp->w_cursor.col < shl->rm.endpos[0].col)) { - shl->has_cursor = true; + if (shl == search_hl) { + check_cur_search_hl(wp, shl); } // Highlight one character for an empty match. @@ -723,6 +728,11 @@ int update_search_hl(win_T *wp, linenr_T lnum, colnr_T col, char_u **line, match shl->endcol = MAXCOL; } + // check if the cursor is in the match + if (shl == search_hl) { + check_cur_search_hl(wp, shl); + } + if (shl->startcol == shl->endcol) { // highlight empty match, try again after it shl->endcol += utfc_ptr2len(*line + shl->endcol); diff --git a/src/nvim/testdir/test_search.vim b/src/nvim/testdir/test_search.vim index 24ecc58281..d359e69f91 100644 --- a/src/nvim/testdir/test_search.vim +++ b/src/nvim/testdir/test_search.vim @@ -951,7 +951,7 @@ func Test_hlsearch_cursearch() let lines =<< trim END set hlsearch scrolloff=0 - call setline(1, ['one', 'foo', 'bar', 'baz', 'foo', 'bar']) + call setline(1, ['one', 'foo', 'bar', 'baz', 'foo the foo and foo', 'bar']) hi Search ctermbg=yellow hi CurSearch ctermbg=blue END @@ -964,7 +964,14 @@ func Test_hlsearch_cursearch() call term_sendkeys(buf, "n") call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_single_line_2', {}) - call term_sendkeys(buf, "?\<CR>") + call term_sendkeys(buf, "n") + call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_single_line_2a', {}) + + call term_sendkeys(buf, "n") + call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_single_line_2b', {}) + + call term_sendkeys(buf, ":call setline(5, 'foo')\<CR>") + call term_sendkeys(buf, "0?\<CR>") call VerifyScreenDump(buf, 'Test_hlsearch_cursearch_single_line_3', {}) call term_sendkeys(buf, "gg/foo\\nbar\<CR>") |