summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-05-24 22:08:15 +0200
committerBram Moolenaar <Bram@vim.org>2019-05-24 22:08:15 +0200
commit8f46e4c4bde13fd5ad68a6670b79cc462b65fbec (patch)
treefd1171bb8285f800b7621411d9ba742d2e5f6e39
parent7b31a181c84ec6b9050892e80f3132907569f8d8 (diff)
patch 8.1.1390: search stats are off when using count or offsetv8.1.1390
Problem: Search stats are off when using count or offset. Solution: Recompute the stats when needed. (Masato Nishihata, closes #4410)
-rw-r--r--src/search.c16
-rw-r--r--src/testdir/test_search_stat.vim19
-rw-r--r--src/version.c2
3 files changed, 33 insertions, 4 deletions
diff --git a/src/search.c b/src/search.c
index bbe370356d..313892f706 100644
--- a/src/search.c
+++ b/src/search.c
@@ -26,7 +26,7 @@ static void show_pat_in_path(char_u *, int,
#ifdef FEAT_VIMINFO
static void wvsp_one(FILE *fp, int idx, char *s, int sc);
#endif
-static void search_stat(int dirc, pos_T *pos, int show_top_bot_msg, char_u *msgbuf);
+static void search_stat(int dirc, pos_T *pos, int show_top_bot_msg, char_u *msgbuf, int recompute);
/*
* This file contains various searching-related routines. These fall into
@@ -1219,6 +1219,7 @@ do_search(
char_u *ps;
char_u *msgbuf = NULL;
size_t len;
+ int has_offset = FALSE;
#define SEARCH_STAT_BUF_LEN 12
/*
@@ -1550,6 +1551,8 @@ do_search(
*/
if (!(options & SEARCH_NOOF) || (pat != NULL && *pat == ';'))
{
+ pos_T org_pos = pos;
+
if (spats[0].off.line) /* Add the offset to the line number. */
{
c = pos.lnum + spats[0].off.off;
@@ -1581,6 +1584,8 @@ do_search(
break;
}
}
+ if (!EQUAL_POS(pos, org_pos))
+ has_offset = TRUE;
}
// Show [1/15] if 'S' is not in 'shortmess'.
@@ -1590,7 +1595,8 @@ do_search(
&& c != FAIL
&& !shortmess(SHM_SEARCHCOUNT)
&& msgbuf != NULL)
- search_stat(dirc, &pos, show_top_bot_msg, msgbuf);
+ search_stat(dirc, &pos, show_top_bot_msg, msgbuf,
+ (count != 1 || has_offset));
/*
* The search command can be followed by a ';' to do another search.
@@ -4915,13 +4921,15 @@ linewhite(linenr_T lnum)
/*
* Add the search count "[3/19]" to "msgbuf".
+ * When "recompute" is TRUE always recompute the numbers.
*/
static void
search_stat(
int dirc,
pos_T *pos,
int show_top_bot_msg,
- char_u *msgbuf)
+ char_u *msgbuf,
+ int recompute)
{
int save_ws = p_ws;
int wraparound = FALSE;
@@ -4947,7 +4955,7 @@ search_stat(
&& MB_STRNICMP(lastpat, spats[last_idx].pat, STRLEN(lastpat)) == 0
&& STRLEN(lastpat) == STRLEN(spats[last_idx].pat)
&& EQUAL_POS(lastpos, curwin->w_cursor)
- && lbuf == curbuf) || wraparound || cur < 0 || cur > 99)
+ && lbuf == curbuf) || wraparound || cur < 0 || cur > 99 || recompute)
{
cur = 0;
cnt = 0;
diff --git a/src/testdir/test_search_stat.vim b/src/testdir/test_search_stat.vim
index ad46b2d059..cf36f3214a 100644
--- a/src/testdir/test_search_stat.vim
+++ b/src/testdir/test_search_stat.vim
@@ -117,6 +117,25 @@ func! Test_search_stat()
call assert_false(1)
endtry
+ " with count
+ call cursor(1, 1)
+ let @/ = 'fo*\(bar\?\)\?'
+ let g:a = execute(':unsilent :norm! 2n')
+ let stat = '\[3/50\]'
+ let pat = escape(@/, '()*?'). '\s\+'
+ call assert_match(pat .. stat, g:a)
+ let g:a = execute(':unsilent :norm! 2n')
+ let stat = '\[5/50\]'
+ call assert_match(pat .. stat, g:a)
+
+ " with offset
+ call cursor(1, 1)
+ call feedkeys("/fo*\\(bar\\?\\)\\?/+1\<cr>", 'tx')
+ let g:a = execute(':unsilent :norm! n')
+ let stat = '\[5/50\]'
+ let pat = escape(@/ .. '/+1', '()*?'). '\s\+'
+ call assert_match(pat .. stat, g:a)
+
" normal, n comes from a mapping
" Need to move over more than 64 lines to trigger char_avail(.
nnoremap n nzv
diff --git a/src/version.c b/src/version.c
index 03ad4bcdf0..a97163376f 100644
--- a/src/version.c
+++ b/src/version.c
@@ -768,6 +768,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1390,
+/**/
1389,
/**/
1388,