summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilly <milly.ca@gmail.com>2022-05-26 13:16:25 +0100
committerBram Moolenaar <Bram@vim.org>2022-05-26 13:16:25 +0100
commitc7e54efe4dc2bd8fd86feb4a26b4485b7b4c8578 (patch)
treee47bd61af75370460f507181272624fce3d7f7ca
parent0f7a3e1de6f71e8e1423fe594890d6aa7f94e132 (diff)
downloadvim-git-c7e54efe4dc2bd8fd86feb4a26b4485b7b4c8578.tar.gz
patch 8.2.5020: using 'imstatusfunc' and 'imactivatefunc' breaks 'foldopen'v8.2.5020
Problem: Using 'imstatusfunc' and 'imactivatefunc' breaks 'foldopen'. Solution: Save and restore the KeyTyped flag. (closes #10479)
-rw-r--r--src/gui_xim.c6
-rw-r--r--src/testdir/test_iminsert.vim29
-rw-r--r--src/version.c2
3 files changed, 37 insertions, 0 deletions
diff --git a/src/gui_xim.c b/src/gui_xim.c
index 9f3181e76..4d8706a10 100644
--- a/src/gui_xim.c
+++ b/src/gui_xim.c
@@ -89,17 +89,21 @@ set_imstatusfunc_option(void)
call_imactivatefunc(int active)
{
typval_T argv[2];
+ int save_KeyTyped = KeyTyped;
argv[0].v_type = VAR_NUMBER;
argv[0].vval.v_number = active ? 1 : 0;
argv[1].v_type = VAR_UNKNOWN;
(void)call_callback_retnr(&imaf_cb, 1, argv);
+
+ KeyTyped = save_KeyTyped;
}
static int
call_imstatusfunc(void)
{
int is_active;
+ int save_KeyTyped = KeyTyped;
// FIXME: Don't execute user function in unsafe situation.
if (exiting || is_autocmd_blocked())
@@ -109,6 +113,8 @@ call_imstatusfunc(void)
++msg_silent;
is_active = call_callback_retnr(&imsf_cb, 0, NULL);
--msg_silent;
+
+ KeyTyped = save_KeyTyped;
return (is_active > 0);
}
#endif
diff --git a/src/testdir/test_iminsert.vim b/src/testdir/test_iminsert.vim
index e5ded5866..a0e9db0a7 100644
--- a/src/testdir/test_iminsert.vim
+++ b/src/testdir/test_iminsert.vim
@@ -63,6 +63,35 @@ func Test_getimstatus()
set imstatusfunc=
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
func Test_lmap_in_insert_mode()
new
diff --git a/src/version.c b/src/version.c
index 9589d792c..6a6f07dab 100644
--- a/src/version.c
+++ b/src/version.c
@@ -735,6 +735,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 5020,
+/**/
5019,
/**/
5018,