From 6dd7424c7e6ab81998c29ca3526c41b75cfde5a1 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Mon, 14 Feb 2022 12:44:32 +0000 Subject: 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) --- src/search.c | 27 ++++++++++++++++++ src/testdir/dumps/Test_searchstat_inc_1.dump | 10 +++++++ src/testdir/dumps/Test_searchstat_inc_2.dump | 10 +++++++ src/testdir/dumps/Test_searchstat_inc_3.dump | 10 +++++++ src/testdir/test_search_stat.vim | 42 ++++++++++++++++++++++++++++ src/version.c | 2 ++ 6 files changed, 101 insertions(+) create mode 100644 src/testdir/dumps/Test_searchstat_inc_1.dump create mode 100644 src/testdir/dumps/Test_searchstat_inc_2.dump create mode 100644 src/testdir/dumps/Test_searchstat_inc_3.dump diff --git a/src/search.c b/src/search.c index 641d439a4..f4c2c873b 100644 --- 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_T *rettv) } 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_T *rettv) 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 index 000000000..aa4b6c527 --- /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 index 000000000..3b580efb7 --- /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 index 000000000..a57b4d18a --- /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 index 15da15556..e0820e422 100644 --- 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 index 17bc3f7c9..4b2ac38bb 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4378, /**/ 4377, /**/ -- cgit v1.2.1