1
0
forked from aniani/vim

patch 8.1.0696: when test_edit fails 'insertmode' may not be reset

Problem:    When test_edit fails 'insertmode' may not be reset and the next
            test may get stuck. (James McCoy)
Solution:   Always reset 'insertmode' after executing a test.  Avoid that an
            InsertCharPre autocommand or a 'complete' function can change the
            state. (closes #3768)
This commit is contained in:
Bram Moolenaar
2019-01-06 15:29:57 +01:00
parent f42b45d719
commit 8ad16da729
3 changed files with 18 additions and 1 deletions

View File

@@ -4219,6 +4219,7 @@ expand_by_function(
win_T *curwin_save; win_T *curwin_save;
buf_T *curbuf_save; buf_T *curbuf_save;
typval_T rettv; typval_T rettv;
int save_State = State;
funcname = (type == CTRL_X_FUNCTION) ? curbuf->b_p_cfu : curbuf->b_p_ofu; funcname = (type == CTRL_X_FUNCTION) ? curbuf->b_p_cfu : curbuf->b_p_ofu;
if (*funcname == NUL) if (*funcname == NUL)
@@ -4272,6 +4273,9 @@ expand_by_function(
ins_compl_add_dict(matchdict); ins_compl_add_dict(matchdict);
theend: theend:
// Restore State, it might have been changed.
State = save_State;
if (matchdict != NULL) if (matchdict != NULL)
dict_unref(matchdict); dict_unref(matchdict);
if (matchlist != NULL) if (matchlist != NULL)
@@ -5549,6 +5553,7 @@ ins_complete(int c, int enable_pum)
pos_T pos; pos_T pos;
win_T *curwin_save; win_T *curwin_save;
buf_T *curbuf_save; buf_T *curbuf_save;
int save_State = State;
/* Call 'completefunc' or 'omnifunc' and get pattern length as a /* Call 'completefunc' or 'omnifunc' and get pattern length as a
* string */ * string */
@@ -5572,6 +5577,8 @@ ins_complete(int c, int enable_pum)
curwin_save = curwin; curwin_save = curwin;
curbuf_save = curbuf; curbuf_save = curbuf;
col = call_func_retnr(funcname, 2, args); col = call_func_retnr(funcname, 2, args);
State = save_State;
if (curwin_save != curwin || curbuf_save != curbuf) if (curwin_save != curwin || curbuf_save != curbuf)
{ {
EMSG(_(e_complwin)); EMSG(_(e_complwin));
@@ -10730,6 +10737,7 @@ do_insert_char_pre(int c)
{ {
char_u *res; char_u *res;
char_u buf[MB_MAXBYTES + 1]; char_u buf[MB_MAXBYTES + 1];
int save_State = State;
/* Return quickly when there is nothing to do. */ /* Return quickly when there is nothing to do. */
if (!has_insertcharpre()) if (!has_insertcharpre())
@@ -10762,6 +10770,9 @@ do_insert_char_pre(int c)
set_vim_var_string(VV_CHAR, NULL, -1); /* clear v:char */ set_vim_var_string(VV_CHAR, NULL, -1); /* clear v:char */
--textlock; --textlock;
// Restore the State, it may have been changed.
State = save_State;
return res; return res;
} }
#endif #endif

View File

@@ -149,6 +149,10 @@ func RunTheTest(test)
endtry endtry
endif endif
" In case 'insertmode' was set and something went wrong, make sure it is
" reset to avoid trouble with anything else.
set noinsertmode
if exists("*TearDown") if exists("*TearDown")
try try
call TearDown() call TearDown()

View File

@@ -799,6 +799,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 */
/**/
696,
/**/ /**/
695, 695,
/**/ /**/