diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-01-06 15:29:57 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-01-06 15:29:57 +0100 |
commit | 8ad16da7290190f55f88073d5586dfe133fddf45 (patch) | |
tree | 41188d4134f13d2a85a4aaff0220ced1d8a4670c /src | |
parent | f42b45d719e03218735b3c2845a74dca9c0efd60 (diff) |
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)
Diffstat (limited to 'src')
-rw-r--r-- | src/edit.c | 11 | ||||
-rw-r--r-- | src/testdir/runtest.vim | 6 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 18 insertions, 1 deletions
diff --git a/src/edit.c b/src/edit.c index 65f2bb1e7d..d4951d9f34 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 89c1e3a5e0..a8b43aaed9 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 790c4f7706..3f6b5ec3b2 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, |