# HG changeset patch # User Bram Moolenaar # Date 1644842702 -3600 # Node ID 4c68fb88b73f771c098d91d8a9c3bebc6f71c3e5 # Parent 0d4c4c3ca0d00b9bdc38c81bd3023b862917fd6d patch 8.2.4378: incsearch HL broken when calling searchcount in 'tabLine' Commit: https://github.com/vim/vim/commit/6dd7424c7e6ab81998c29ca3526c41b75cfde5a1 Author: Christian Brabandt Date: Mon Feb 14 12:44:32 2022 +0000 patch 8.2.4378: incsearch HL broken when calling searchcount in 'tabLine' Problem: Incsearch highlight broken when calling searchcount() in 'tabLine' function. (Mirko Palmer) Solution: Save and restore the incsearch state. (Christian Brabandt, closes #9763, closes #9633) diff --git a/src/search.c b/src/search.c --- a/src/search.c +++ b/src/search.c @@ -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 @@ -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) { @@ -4182,6 +4203,9 @@ f_searchcount(typval_T *argvars, typval_ } save_last_search_pattern(); +#ifdef FEAT_SEARCH_EXTRA + save_incsearch_state(); +#endif if (pattern != NULL) { if (*pattern == NUL) @@ -4202,6 +4226,9 @@ f_searchcount(typval_T *argvars, typval_ the_end: restore_last_search_pattern(); +#ifdef FEAT_SEARCH_EXTRA + restore_incsearch_state(); +#endif } /* diff --git a/src/testdir/dumps/Test_searchstat_inc_1.dump b/src/testdir/dumps/Test_searchstat_inc_1.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_searchstat_inc_1.dump @@ -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 diff --git a/src/testdir/dumps/Test_searchstat_inc_2.dump b/src/testdir/dumps/Test_searchstat_inc_2.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_searchstat_inc_2.dump @@ -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 diff --git a/src/testdir/dumps/Test_searchstat_inc_3.dump b/src/testdir/dumps/Test_searchstat_inc_3.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_searchstat_inc_3.dump @@ -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 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 @@ -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, "\") + call TermWait(buf) + call VerifyScreenDump(buf, 'Test_searchstat_inc_2', {}) + + call term_sendkeys(buf, "\") + call TermWait(buf) + call VerifyScreenDump(buf, 'Test_searchstat_inc_3', {}) + + call term_sendkeys(buf, "\:qa\") + call TermWait(buf) + + call StopVimInTerminal(buf) + call delete('Xsearchstat_inc') +endfunc " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4378, +/**/ 4377, /**/ 4376,