# HG changeset patch # User Bram Moolenaar # Date 1558728905 -7200 # Node ID 7d4c814a8554dfdc5c4aa7e3692859cb1e98dd21 # Parent f88e274120e4b9909def25fb6bebd4bc2fdbc358 patch 8.1.1390: search stats are off when using count or offset commit https://github.com/vim/vim/commit/8f46e4c4bde13fd5ad68a6670b79cc462b65fbec Author: Bram Moolenaar Date: Fri May 24 22:08:15 2019 +0200 patch 8.1.1390: search stats are off when using count or offset Problem: Search stats are off when using count or offset. Solution: Recompute the stats when needed. (Masato Nishihata, closes https://github.com/vim/vim/issues/4410) diff --git a/src/search.c b/src/search.c --- a/src/search.c +++ b/src/search.c @@ -26,7 +26,7 @@ static void show_pat_in_path(char_u *, i #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 --- 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\", '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 --- 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,