1
0
forked from aniani/vim

patch 8.2.0902: using searchcount() in 'statusline' causes an error

Problem:    Using searchcount() in 'statusline' causes an error.
Solution:   Avoid saving/restoring the search patten recursively.
            (closes #6194)
This commit is contained in:
Bram Moolenaar
2020-06-04 20:56:09 +02:00
parent e52702f003
commit 442a85369f
4 changed files with 48 additions and 7 deletions

View File

@@ -356,10 +356,9 @@ static int saved_no_hlsearch = 0;
void void
save_last_search_pattern(void) save_last_search_pattern(void)
{ {
if (did_save_last_search_spat != 0) if (++did_save_last_search_spat != 1)
iemsg("did_save_last_search_spat is not zero"); // nested call, nothing to do
else return;
++did_save_last_search_spat;
saved_last_search_spat = spats[RE_SEARCH]; saved_last_search_spat = spats[RE_SEARCH];
if (spats[RE_SEARCH].pat != NULL) if (spats[RE_SEARCH].pat != NULL)
@@ -371,12 +370,14 @@ save_last_search_pattern(void)
void void
restore_last_search_pattern(void) restore_last_search_pattern(void)
{ {
if (did_save_last_search_spat != 1) if (--did_save_last_search_spat > 0)
// nested call, nothing to do
return;
if (did_save_last_search_spat != 0)
{ {
iemsg("did_save_last_search_spat is not one"); iemsg("restore_last_search_pattern() called more often than save_last_search_pattern()");
return; return;
} }
--did_save_last_search_spat;
vim_free(spats[RE_SEARCH].pat); vim_free(spats[RE_SEARCH].pat);
spats[RE_SEARCH] = saved_last_search_spat; spats[RE_SEARCH] = saved_last_search_spat;

View File

@@ -0,0 +1,10 @@
|t+0&#ffffff0|h|i|s| |i|s| |s+1&&|o|m|e|t|h|i|n|g| +0&&@57
@75
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|[+3#0000000&|1|/|1|]| @69
|/+0&&|s|o|m|e|t|h|i|n|g> @64

View File

@@ -263,6 +263,34 @@ func Test_searchcount_fails()
call assert_fails('echo searchcount("boo!")', 'E715:') call assert_fails('echo searchcount("boo!")', 'E715:')
endfunc endfunc
func Test_searchcount_in_statusline()
CheckScreendump
let lines =<< trim END
set shortmess-=S
call append(0, 'this is something')
function TestSearchCount() abort
let search_count = searchcount()
if !empty(search_count)
return '[' . search_count.current . '/' . search_count.total . ']'
else
return ''
endif
endfunction
set hlsearch
set laststatus=2 statusline+=%{TestSearchCount()}
END
call writefile(lines, 'Xsearchstatusline')
let buf = RunVimInTerminal('-S Xsearchstatusline', #{rows: 10})
call TermWait(buf)
call term_sendkeys(buf, "/something")
call VerifyScreenDump(buf, 'Test_searchstat_4', {})
call term_sendkeys(buf, "\<Esc>")
call StopVimInTerminal(buf)
call delete('Xsearchstatusline')
endfunc
func Test_search_stat_foldopen() func Test_search_stat_foldopen()
CheckScreendump CheckScreendump

View File

@@ -746,6 +746,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
902,
/**/ /**/
901, 901,
/**/ /**/