aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-04-23 06:55:24 +0800
committerzeertzjq <zeertzjq@outlook.com>2022-04-23 19:24:47 +0800
commit8db55aedb52883f4b024ddd05524e18bc93d5c0b (patch)
tree16321677901f5e15cd9c8b89566dbfbacfc7055b /src
parent4e4914ab2e523f100c06fc5fb253f8625cc67232 (diff)
downloadrneovim-8db55aedb52883f4b024ddd05524e18bc93d5c0b.tar.gz
rneovim-8db55aedb52883f4b024ddd05524e18bc93d5c0b.tar.bz2
rneovim-8db55aedb52883f4b024ddd05524e18bc93d5c0b.zip
vim-patch:8.2.4805: CurSearch used for all matches in current line
Problem: CurSearch used for all matches in current line. Solution: Don't use the non-zero line count. (closes vim/vim#10247) https://github.com/vim/vim/commit/9b36750640e8e89f18afa1446ed80fdbdf0fcac0
Diffstat (limited to 'src')
-rw-r--r--src/nvim/match.c35
-rw-r--r--src/nvim/testdir/test_search.vim11
2 files changed, 34 insertions, 12 deletions
diff --git a/src/nvim/match.c b/src/nvim/match.c
index f6d2fe13c4..c946ed5e02 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)
+{
+ long linecount = shl->rm.endpos[0].lnum - shl->rm.startpos[0].lnum;
+
+ 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 + 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.
@@ -609,20 +625,14 @@ 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 = shl->rm.endpos[0].lnum - shl->rm.startpos[0].lnum;
+ if (shl->lines == 0) {
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 +733,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>")