0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 9.0.1538: :wqall does not trigger ExitPre

Problem:    :wqall does not trigger ExitPre. (Bart Libert)
Solution:   Move preparations for :qall to a common function. (closes #12374)
This commit is contained in:
Bram Moolenaar
2023-05-10 16:53:27 +01:00
parent 65b34868da
commit 411da64e77
5 changed files with 37 additions and 6 deletions

View File

@@ -2269,7 +2269,11 @@ do_wqall(exarg_T *eap)
int save_forceit = eap->forceit; int save_forceit = eap->forceit;
if (eap->cmdidx == CMD_xall || eap->cmdidx == CMD_wqall) if (eap->cmdidx == CMD_xall || eap->cmdidx == CMD_wqall)
{
if (before_quit_all(eap) == FAIL)
return;
exiting = TRUE; exiting = TRUE;
}
FOR_ALL_BUFFERS(buf) FOR_ALL_BUFFERS(buf)
{ {

View File

@@ -5957,10 +5957,11 @@ ex_cquit(exarg_T *eap UNUSED)
} }
/* /*
* ":qall": try to quit all windows * Do preparations for "qall" and "wqall".
* Returns FAIL when quitting should be aborted.
*/ */
static void int
ex_quit_all(exarg_T *eap) before_quit_all(exarg_T *eap)
{ {
if (cmdwin_type != 0) if (cmdwin_type != 0)
{ {
@@ -5968,19 +5969,30 @@ ex_quit_all(exarg_T *eap)
cmdwin_result = K_XF1; // ex_window() takes care of this cmdwin_result = K_XF1; // ex_window() takes care of this
else else
cmdwin_result = K_XF2; cmdwin_result = K_XF2;
return; return FAIL;
} }
// Don't quit while editing the command line. // Don't quit while editing the command line.
if (text_locked()) if (text_locked())
{ {
text_locked_msg(); text_locked_msg();
return; return FAIL;
} }
if (before_quit_autocmds(curwin, TRUE, eap->forceit)) if (before_quit_autocmds(curwin, TRUE, eap->forceit))
return; return FAIL;
return OK;
}
/*
* ":qall": try to quit all windows
*/
static void
ex_quit_all(exarg_T *eap)
{
if (before_quit_all(eap) == FAIL)
return;
exiting = TRUE; exiting = TRUE;
if (eap->forceit || !check_changed_any(FALSE, FALSE)) if (eap->forceit || !check_changed_any(FALSE, FALSE))
getout(0); getout(0);

View File

@@ -39,6 +39,7 @@ char_u *get_command_name(expand_T *xp, int idx);
void not_exiting(void); void not_exiting(void);
int before_quit_autocmds(win_T *wp, int quit_all, int forceit); int before_quit_autocmds(win_T *wp, int quit_all, int forceit);
void ex_quit(exarg_T *eap); void ex_quit(exarg_T *eap);
int before_quit_all(exarg_T *eap);
void tabpage_close(int forceit); void tabpage_close(int forceit);
void tabpage_close_other(tabpage_T *tp, int forceit); void tabpage_close_other(tabpage_T *tp, int forceit);
void ex_stop(exarg_T *eap); void ex_stop(exarg_T *eap);

View File

@@ -81,6 +81,18 @@ func Test_exiting()
\ readfile('Xtestout')) \ readfile('Xtestout'))
endif endif
call delete('Xtestout') call delete('Xtestout')
" ExitPre autocommand also executed on :wqall
let after =<< trim [CODE]
au QuitPre * call writefile(["QuitPre"], "Xtestout", "a")
au ExitPre * call writefile(["ExitPre"], "Xtestout", "a")
wqall
[CODE]
if RunVim([], after, '')
call assert_equal(['QuitPre', 'ExitPre'], readfile('Xtestout'))
endif
call delete('Xtestout')
endfunc endfunc
" Test for getting the Vim exit code from v:exiting " Test for getting the Vim exit code from v:exiting

View File

@@ -695,6 +695,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 */
/**/
1538,
/**/ /**/
1537, 1537,
/**/ /**/