summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-01-06 15:29:57 +0100
committerBram Moolenaar <Bram@vim.org>2019-01-06 15:29:57 +0100
commit8ad16da7290190f55f88073d5586dfe133fddf45 (patch)
tree41188d4134f13d2a85a4aaff0220ced1d8a4670c
parentf42b45d719e03218735b3c2845a74dca9c0efd60 (diff)
downloadvim-git-8ad16da7290190f55f88073d5586dfe133fddf45.tar.gz
patch 8.1.0696: when test_edit fails 'insertmode' may not be resetv8.1.0696
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)
-rw-r--r--src/edit.c11
-rw-r--r--src/testdir/runtest.vim6
-rw-r--r--src/version.c2
3 files changed, 18 insertions, 1 deletions
diff --git a/src/edit.c b/src/edit.c
index 65f2bb1e7..d4951d9f3 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -4219,6 +4219,7 @@ expand_by_function(
win_T *curwin_save;
buf_T *curbuf_save;
typval_T rettv;
+ int save_State = State;
funcname = (type == CTRL_X_FUNCTION) ? curbuf->b_p_cfu : curbuf->b_p_ofu;
if (*funcname == NUL)
@@ -4272,6 +4273,9 @@ expand_by_function(
ins_compl_add_dict(matchdict);
theend:
+ // Restore State, it might have been changed.
+ State = save_State;
+
if (matchdict != NULL)
dict_unref(matchdict);
if (matchlist != NULL)
@@ -5549,6 +5553,7 @@ ins_complete(int c, int enable_pum)
pos_T pos;
win_T *curwin_save;
buf_T *curbuf_save;
+ int save_State = State;
/* Call 'completefunc' or 'omnifunc' and get pattern length as a
* string */
@@ -5572,6 +5577,8 @@ ins_complete(int c, int enable_pum)
curwin_save = curwin;
curbuf_save = curbuf;
col = call_func_retnr(funcname, 2, args);
+
+ State = save_State;
if (curwin_save != curwin || curbuf_save != curbuf)
{
EMSG(_(e_complwin));
@@ -10730,6 +10737,7 @@ do_insert_char_pre(int c)
{
char_u *res;
char_u buf[MB_MAXBYTES + 1];
+ int save_State = State;
/* Return quickly when there is nothing to do. */
if (!has_insertcharpre())
@@ -10762,6 +10770,9 @@ do_insert_char_pre(int c)
set_vim_var_string(VV_CHAR, NULL, -1); /* clear v:char */
--textlock;
+ // Restore the State, it may have been changed.
+ State = save_State;
+
return res;
}
#endif
diff --git a/src/testdir/runtest.vim b/src/testdir/runtest.vim
index 89c1e3a5e..a8b43aaed 100644
--- a/src/testdir/runtest.vim
+++ b/src/testdir/runtest.vim
@@ -26,7 +26,7 @@
" It will be called after each Test_ function.
"
" When debugging a test it can be useful to add messages to v:errors:
-" call add(v:errors, "this happened")
+" call add(v:errors, "this happened")
" Without the +eval feature we can't run these tests, bail out.
@@ -149,6 +149,10 @@ func RunTheTest(test)
endtry
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")
try
call TearDown()
diff --git a/src/version.c b/src/version.c
index 790c4f770..3f6b5ec3b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -800,6 +800,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 696,
+/**/
695,
/**/
694,