vim-patch:8.2.4378: incsearch HL broken when calling searchcount in 'tabLine' (#19147)

Problem:    Incsearch highlight broken when calling searchcount() in 'tabLine'
            function. (Mirko Palmer)
Solution:   Save and restore the incsearch state. (Christian Brabandt,
            closes vim/vim#9763, closes vim/vim#9633)
6dd7424c7e
This commit is contained in:
zeertzjq 2022-06-29 19:34:37 +08:00 committed by GitHub
parent bab32bba7a
commit 8ea09fc908
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 124 additions and 0 deletions

View File

@ -286,6 +286,8 @@ static struct spat saved_last_search_spat;
static int did_save_last_search_spat = 0; static int did_save_last_search_spat = 0;
static int saved_last_idx = 0; static int saved_last_idx = 0;
static bool saved_no_hlsearch = false; static bool saved_no_hlsearch = false;
static colnr_T saved_search_match_endcol;
static linenr_T saved_search_match_lines;
/// Save and restore the search pattern for incremental highlight search /// Save and restore the search pattern for incremental highlight search
/// feature. /// feature.
@ -328,6 +330,21 @@ void restore_last_search_pattern(void)
set_no_hlsearch(saved_no_hlsearch); 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) char_u *last_search_pattern(void)
{ {
return spats[RE_SEARCH].pat; return spats[RE_SEARCH].pat;
@ -4717,6 +4734,7 @@ void f_searchcount(typval_T *argvars, typval_T *rettv, FunPtr fptr)
} }
save_last_search_pattern(); save_last_search_pattern();
save_incsearch_state();
if (pattern != NULL) { if (pattern != NULL) {
if (*pattern == NUL) { if (*pattern == NUL) {
goto the_end; goto the_end;
@ -4738,6 +4756,7 @@ void f_searchcount(typval_T *argvars, typval_T *rettv, FunPtr fptr)
the_end: the_end:
restore_last_search_pattern(); restore_last_search_pattern();
restore_incsearch_state();
} }
/// Fuzzy string matching /// Fuzzy string matching

View File

@ -370,6 +370,48 @@ func Test_search_stat_then_gd()
call delete('Xsearchstatgd') call delete('Xsearchstatgd')
endfunc 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 " vim: shiftwidth=2 sts=2 expandtab

View File

@ -12,6 +12,7 @@ describe('search stat', function()
[1] = {bold = true, foreground = Screen.colors.Blue}, -- NonText [1] = {bold = true, foreground = Screen.colors.Blue}, -- NonText
[2] = {background = Screen.colors.Yellow}, -- Search [2] = {background = Screen.colors.Yellow}, -- Search
[3] = {foreground = Screen.colors.Blue4, background = Screen.colors.LightGrey}, -- Folded [3] = {foreground = Screen.colors.Blue4, background = Screen.colors.LightGrey}, -- Folded
[4] = {reverse = true}, -- IncSearch, TabLineFill
}) })
screen:attach() screen:attach()
end) end)
@ -118,4 +119,66 @@ describe('search stat', function()
| |
]]) ]])
end) end)
it('is not broken by calling searchcount() in tabline vim-patch:8.2.4378', function()
exec([[
call setline(1, ['abc--c', '--------abc', '--abc'])
set hlsearch
set incsearch
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()
]])
feed('/abc')
screen:expect([[
{4: }|
{2:abc}--c |
--------{4:abc} |
--{2:abc} |
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
/abc^ |
]])
feed('<C-G>')
screen:expect([[
{4:3/3 }|
{2:abc}--c |
--------{2:abc} |
--{4:abc} |
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
/abc^ |
]])
feed('<C-G>')
screen:expect([[
{4:1/3 }|
{4:abc}--c |
--------{2:abc} |
--{2:abc} |
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
/abc^ |
]])
end)
end) end)