1
0
forked from aniani/vim

patch 8.2.5020: using 'imstatusfunc' and 'imactivatefunc' breaks 'foldopen'

Problem:    Using 'imstatusfunc' and 'imactivatefunc' breaks 'foldopen'.
Solution:   Save and restore the KeyTyped flag. (closes #10479)
This commit is contained in:
Milly
2022-05-26 13:16:25 +01:00
committed by Bram Moolenaar
parent 0f7a3e1de6
commit c7e54efe4d
3 changed files with 37 additions and 0 deletions

View File

@@ -89,17 +89,21 @@ set_imstatusfunc_option(void)
call_imactivatefunc(int active) call_imactivatefunc(int active)
{ {
typval_T argv[2]; typval_T argv[2];
int save_KeyTyped = KeyTyped;
argv[0].v_type = VAR_NUMBER; argv[0].v_type = VAR_NUMBER;
argv[0].vval.v_number = active ? 1 : 0; argv[0].vval.v_number = active ? 1 : 0;
argv[1].v_type = VAR_UNKNOWN; argv[1].v_type = VAR_UNKNOWN;
(void)call_callback_retnr(&imaf_cb, 1, argv); (void)call_callback_retnr(&imaf_cb, 1, argv);
KeyTyped = save_KeyTyped;
} }
static int static int
call_imstatusfunc(void) call_imstatusfunc(void)
{ {
int is_active; int is_active;
int save_KeyTyped = KeyTyped;
// FIXME: Don't execute user function in unsafe situation. // FIXME: Don't execute user function in unsafe situation.
if (exiting || is_autocmd_blocked()) if (exiting || is_autocmd_blocked())
@@ -109,6 +113,8 @@ call_imstatusfunc(void)
++msg_silent; ++msg_silent;
is_active = call_callback_retnr(&imsf_cb, 0, NULL); is_active = call_callback_retnr(&imsf_cb, 0, NULL);
--msg_silent; --msg_silent;
KeyTyped = save_KeyTyped;
return (is_active > 0); return (is_active > 0);
} }
#endif #endif

View File

@@ -63,6 +63,35 @@ func Test_getimstatus()
set imstatusfunc= set imstatusfunc=
endfunc endfunc
func Test_imactivatefunc_imstatusfunc_callback_no_breaks_foldopen()
CheckScreendump
let lines =<< trim END
func IM_activatefunc(active)
endfunc
func IM_statusfunc()
return 0
endfunc
set imactivatefunc=IM_activatefunc
set imstatusfunc=IM_statusfunc
set foldmethod=marker
set foldopen=search
call setline(1, ['{{{', 'abc', '}}}'])
%foldclose
END
call writefile(lines, 'Xscript')
let buf = RunVimInTerminal('-S Xscript', {})
call term_wait(buf)
call assert_notequal('abc', term_getline(buf, 2))
call term_sendkeys(buf, "/abc\n")
call term_wait(buf)
call assert_equal('abc', term_getline(buf, 2))
" clean up
call StopVimInTerminal(buf)
call delete('Xscript')
endfunc
" Test for using an lmap in insert mode " Test for using an lmap in insert mode
func Test_lmap_in_insert_mode() func Test_lmap_in_insert_mode()
new new

View File

@@ -734,6 +734,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 */
/**/
5020,
/**/ /**/
5019, 5019,
/**/ /**/