mirror of
https://github.com/vim/vim.git
synced 2025-10-01 04:54:07 -04:00
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)
This commit is contained in:
@@ -1224,6 +1224,7 @@ check_due_timer(void)
|
|||||||
int save_must_redraw = must_redraw;
|
int save_must_redraw = must_redraw;
|
||||||
int save_trylevel = trylevel;
|
int save_trylevel = trylevel;
|
||||||
int save_did_throw = did_throw;
|
int save_did_throw = did_throw;
|
||||||
|
int save_ex_pressedreturn = get_pressedreturn();
|
||||||
except_T *save_current_exception = current_exception;
|
except_T *save_current_exception = current_exception;
|
||||||
|
|
||||||
/* Create a scope for running the timer callback, ignoring most of
|
/* Create a scope for running the timer callback, ignoring most of
|
||||||
@@ -1257,6 +1258,7 @@ check_due_timer(void)
|
|||||||
need_update_screen = TRUE;
|
need_update_screen = TRUE;
|
||||||
must_redraw = must_redraw > save_must_redraw
|
must_redraw = must_redraw > save_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
|
/* Only fire the timer again if it repeats and stop_timer() wasn't
|
||||||
* called while inside the callback (tr_id == -1). */
|
* called while inside the callback (tr_id == -1). */
|
||||||
|
@@ -12418,3 +12418,17 @@ ex_folddo(exarg_T *eap)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
# if defined(FEAT_TIMERS) || defined(PROTO)
|
||||||
|
int
|
||||||
|
get_pressedreturn(void)
|
||||||
|
{
|
||||||
|
return ex_pressedreturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
set_pressedreturn(int val)
|
||||||
|
{
|
||||||
|
ex_pressedreturn = val;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
@@ -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_behave_arg(expand_T *xp, int idx);
|
||||||
char_u *get_messages_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);
|
char_u *get_mapclear_arg(expand_T *xp, int idx);
|
||||||
|
int get_pressedreturn(void);
|
||||||
|
void set_pressedreturn(int val);
|
||||||
/* vim: set ft=c : */
|
/* vim: set ft=c : */
|
||||||
|
@@ -246,4 +246,15 @@ func Test_peek_and_get_char()
|
|||||||
call timer_stop(intr)
|
call timer_stop(intr)
|
||||||
endfunc
|
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
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@@ -769,6 +769,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 */
|
||||||
|
/**/
|
||||||
|
1109,
|
||||||
/**/
|
/**/
|
||||||
1108,
|
1108,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user