Skip to content

Commit

Permalink
patch 8.2.4378: incsearch HL broken when calling searchcount in 'tabL…
Browse files Browse the repository at this point in the history
…ine'

Problem:    Incsearch highlight broken when calling searchcount() in 'tabLine'
            function. (Mirko Palmer)
Solution:   Save and restore the incsearch state. (Christian Brabandt,
            closes vim#9763, closes vim#9633)
  • Loading branch information
chrisbra authored and brammool committed Feb 14, 2022
1 parent 0cd3e94 commit 6dd7424
Show file tree
Hide file tree
Showing 6 changed files with 101 additions and 0 deletions.
27 changes: 27 additions & 0 deletions src/search.c
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,8 @@ static spat_T saved_last_search_spat;
static int did_save_last_search_spat = 0;
static int saved_last_idx = 0;
static int saved_no_hlsearch = 0;
static int saved_search_match_endcol;
static int saved_search_match_lines;

/*
* Save and restore the search pattern for incremental highlight search
Expand Down Expand Up @@ -370,6 +372,25 @@ restore_last_search_pattern(void)
set_no_hlsearch(saved_no_hlsearch);
}

/*
* Save and restore the incsearch highlighting variables.
* This is required so that calling searchcount() at does not invalidate the
* incsearch highlighting.
*/
static void
save_incsearch_state(void)
{
saved_search_match_endcol = search_match_endcol;
saved_search_match_lines = search_match_lines;
}

static void
restore_incsearch_state(void)
{
search_match_endcol = saved_search_match_endcol;
search_match_lines = saved_search_match_lines;
}

char_u *
last_search_pattern(void)
{
Expand Down Expand Up @@ -4182,6 +4203,9 @@ f_searchcount(typval_T *argvars, typval_T *rettv)
}

save_last_search_pattern();
#ifdef FEAT_SEARCH_EXTRA
save_incsearch_state();
#endif
if (pattern != NULL)
{
if (*pattern == NUL)
Expand All @@ -4202,6 +4226,9 @@ f_searchcount(typval_T *argvars, typval_T *rettv)

the_end:
restore_last_search_pattern();
#ifdef FEAT_SEARCH_EXTRA
restore_incsearch_state();
#endif
}

/*
Expand Down
10 changes: 10 additions & 0 deletions src/testdir/dumps/Test_searchstat_inc_1.dump
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
| +1&#ffffff0@74
|a+0#0000001#ffff4012|b|c|-+0#0000000#ffffff0@1|c| @68
|-@7|a+1&&|b|c| +0&&@63
|-@1|a+0#0000001#ffff4012|b|c| +0#0000000#ffffff0@69
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|/+0#0000000&|a|b|c> @70
10 changes: 10 additions & 0 deletions src/testdir/dumps/Test_searchstat_inc_2.dump
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
|3+1&#ffffff0|/|3| @71
|a+0#0000001#ffff4012|b|c|-+0#0000000#ffffff0@1|c| @68
|-@7|a+0#0000001#ffff4012|b|c| +0#0000000#ffffff0@63
|-@1|a+1&&|b|c| +0&&@69
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|/+0#0000000&|a|b|c> @70
10 changes: 10 additions & 0 deletions src/testdir/dumps/Test_searchstat_inc_3.dump
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
|1+1&#ffffff0|/|3| @71
|a|b|c|-+0&&@1|c| @68
|-@7|a+0#0000001#ffff4012|b|c| +0#0000000#ffffff0@63
|-@1|a+0#0000001#ffff4012|b|c| +0#0000000#ffffff0@69
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|/+0#0000000&|a|b|c> @70
42 changes: 42 additions & 0 deletions src/testdir/test_search_stat.vim
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,48 @@ func Test_search_stat_then_gd()
call delete('Xsearchstatgd')
endfunc

func Test_search_stat_and_incsearch()
CheckScreendump

let lines =<< trim END
call setline(1, ['abc--c', '--------abc', '--abc'])
set hlsearch
set incsearch
set bg=dark
set showtabline=2

function MyTabLine()
try
let a=searchcount(#{recompute: 1, maxcount: -1})
return a.current .. '/' .. a.total
catch
return ''
endtry
endfunction

set tabline=%!MyTabLine()
END
call writefile(lines, 'Xsearchstat_inc')

let buf = RunVimInTerminal('-S Xsearchstat_inc', #{rows: 10})
call term_sendkeys(buf, "/abc")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_searchstat_inc_1', {})

call term_sendkeys(buf, "\<c-g>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_searchstat_inc_2', {})

call term_sendkeys(buf, "\<c-g>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_searchstat_inc_3', {})

call term_sendkeys(buf, "\<esc>:qa\<cr>")
call TermWait(buf)

call StopVimInTerminal(buf)
call delete('Xsearchstat_inc')
endfunc


" vim: shiftwidth=2 sts=2 expandtab
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -750,6 +750,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
4378,
/**/
4377,
/**/
Expand Down

0 comments on commit 6dd7424

Please sign in to comment.