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:
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user