diff options
author | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2019-01-06 19:52:34 -0500 |
---|---|---|
committer | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2019-01-06 20:30:38 -0500 |
commit | 5395dd62097109236ff3e6473fb90d9560a6fd94 (patch) | |
tree | fbf514f0877a49eb53378c6be09e8f45550a275c /src/nvim/edit.c | |
parent | 0c42e0e8b1e24c2f6e2336ca955a1a5f8d3e0c5b (diff) | |
download | rneovim-5395dd62097109236ff3e6473fb90d9560a6fd94.tar.gz rneovim-5395dd62097109236ff3e6473fb90d9560a6fd94.tar.bz2 rneovim-5395dd62097109236ff3e6473fb90d9560a6fd94.zip |
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 vim/vim#3768)
https://github.com/vim/vim/commit/8ad16da7290190f55f88073d5586dfe133fddf45
Diffstat (limited to 'src/nvim/edit.c')
-rw-r--r-- | src/nvim/edit.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/nvim/edit.c b/src/nvim/edit.c index 41a2be6ad4..eaf1f73868 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -3520,6 +3520,7 @@ expand_by_function ( win_T *curwin_save; buf_T *curbuf_save; typval_T rettv; + const int save_State = State; funcname = (type == CTRL_X_FUNCTION) ? curbuf->b_p_cfu : curbuf->b_p_ofu; if (*funcname == NUL) @@ -3565,6 +3566,9 @@ expand_by_function ( ins_compl_add_dict(matchdict); theend: + // Restore State, it might have been changed. + State = save_State; + if (matchdict != NULL) { tv_dict_unref(matchdict); } @@ -4676,6 +4680,7 @@ static int ins_complete(int c, bool enable_pum) pos_T pos; win_T *curwin_save; buf_T *curbuf_save; + const int save_State = State; /* Call 'completefunc' or 'omnifunc' and get pattern length as a * string */ @@ -4694,6 +4699,8 @@ static int ins_complete(int c, bool enable_pum) curwin_save = curwin; curbuf_save = curbuf; col = call_func_retnr(funcname, 2, args, FALSE); + + State = save_State; if (curwin_save != curwin || curbuf_save != curbuf) { EMSG(_(e_complwin)); return FAIL; @@ -8667,6 +8674,7 @@ static colnr_T get_nolist_virtcol(void) static char_u *do_insert_char_pre(int c) { char buf[MB_MAXBYTES + 1]; + const int save_State = State; // Return quickly when there is nothing to do. if (!has_event(EVENT_INSERTCHARPRE)) { @@ -8691,6 +8699,9 @@ static char_u *do_insert_char_pre(int c) set_vim_var_string(VV_CHAR, NULL, -1); textlock--; + // Restore the State, it may have been changed. + State = save_State; + return res; } |