From f5291f301e9322545f0621b2157e93050d1d4fb3 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 14 Sep 2017 22:55:37 +0200 Subject: patch 8.0.1109: timer causes error on exit from Ex mode Problem: Timer causes error on exit from Ex mode. (xtal8) Solution: save and restore the ex_pressedreturn flag. (Christian Brabandt, closes #2079) --- src/ex_cmds2.c | 2 ++ src/ex_docmd.c | 14 ++++++++++++++ src/proto/ex_docmd.pro | 2 ++ src/testdir/test_timers.vim | 11 +++++++++++ src/version.c | 2 ++ 5 files changed, 31 insertions(+) diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c index 710a2789e8..f0a2a518d5 100644 --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -1224,6 +1224,7 @@ check_due_timer(void) int save_must_redraw = must_redraw; int save_trylevel = trylevel; int save_did_throw = did_throw; + int save_ex_pressedreturn = get_pressedreturn(); except_T *save_current_exception = current_exception; /* Create a scope for running the timer callback, ignoring most of @@ -1257,6 +1258,7 @@ check_due_timer(void) need_update_screen = TRUE; must_redraw = must_redraw > save_must_redraw ? must_redraw : save_must_redraw; + set_pressedreturn(save_ex_pressedreturn); /* Only fire the timer again if it repeats and stop_timer() wasn't * called while inside the callback (tr_id == -1). */ diff --git a/src/ex_docmd.c b/src/ex_docmd.c index 3c51b3aea6..e804e2a5db 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -12418,3 +12418,17 @@ ex_folddo(exarg_T *eap) #endif } #endif + +# if defined(FEAT_TIMERS) || defined(PROTO) + int +get_pressedreturn(void) +{ + return ex_pressedreturn; +} + + void +set_pressedreturn(int val) +{ + ex_pressedreturn = val; +} +#endif diff --git a/src/proto/ex_docmd.pro b/src/proto/ex_docmd.pro index 1a931e5395..116ff4e729 100644 --- a/src/proto/ex_docmd.pro +++ b/src/proto/ex_docmd.pro @@ -63,4 +63,6 @@ void dialog_msg(char_u *buff, char *format, char_u *fname); char_u *get_behave_arg(expand_T *xp, int idx); char_u *get_messages_arg(expand_T *xp, int idx); char_u *get_mapclear_arg(expand_T *xp, int idx); +int get_pressedreturn(void); +void set_pressedreturn(int val); /* vim: set ft=c : */ diff --git a/src/testdir/test_timers.vim b/src/testdir/test_timers.vim index b5b9d67db1..768eeade8c 100644 --- a/src/testdir/test_timers.vim +++ b/src/testdir/test_timers.vim @@ -246,4 +246,15 @@ func Test_peek_and_get_char() call timer_stop(intr) endfunc +func Test_ex_mode() + " Function with an empty line. + func Foo(...) + + endfunc + let timer = timer_start(40, function('g:Foo'), {'repeat':-1}) + " This used to throw error E749. + exe "normal Qsleep 100m\rvi\r" + call timer_stop(timer) +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index c8191cc413..c4a1adac5d 100644 --- a/src/version.c +++ b/src/version.c @@ -769,6 +769,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1109, /**/ 1108, /**/ -- cgit v1.2.3