Mercurial > vim
changeset 32413:edef053f7090 v9.0.1538
patch 9.0.1538: :wqall does not trigger ExitPre
Commit: https://github.com/vim/vim/commit/411da64e77ef9d8edd1a5aa80fa5b9a4b159c93d
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed May 10 16:53:27 2023 +0100
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 https://github.com/vim/vim/issues/12374)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 10 May 2023 18:00:06 +0200 |
parents | 1c735cb266e0 |
children | af8ecf2c7dfc |
files | src/ex_cmds.c src/ex_docmd.c src/proto/ex_docmd.pro src/testdir/test_exit.vim src/version.c |
diffstat | 5 files changed, 38 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -2269,7 +2269,11 @@ do_wqall(exarg_T *eap) int save_forceit = eap->forceit; if (eap->cmdidx == CMD_xall || eap->cmdidx == CMD_wqall) + { + if (before_quit_all(eap) == FAIL) + return; exiting = TRUE; + } FOR_ALL_BUFFERS(buf) {
--- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -5957,10 +5957,11 @@ ex_cquit(exarg_T *eap UNUSED) } /* - * ":qall": try to quit all windows - */ - static void -ex_quit_all(exarg_T *eap) + * Do preparations for "qall" and "wqall". + * Returns FAIL when quitting should be aborted. + */ + int +before_quit_all(exarg_T *eap) { if (cmdwin_type != 0) { @@ -5968,19 +5969,30 @@ ex_quit_all(exarg_T *eap) cmdwin_result = K_XF1; // ex_window() takes care of this else cmdwin_result = K_XF2; - return; + return FAIL; } // Don't quit while editing the command line. if (text_locked()) { text_locked_msg(); - return; + return FAIL; } if (before_quit_autocmds(curwin, TRUE, eap->forceit)) + 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; if (eap->forceit || !check_changed_any(FALSE, FALSE)) getout(0);
--- a/src/proto/ex_docmd.pro +++ b/src/proto/ex_docmd.pro @@ -39,6 +39,7 @@ char_u *get_command_name(expand_T *xp, i void not_exiting(void); int before_quit_autocmds(win_T *wp, int quit_all, int forceit); void ex_quit(exarg_T *eap); +int before_quit_all(exarg_T *eap); void tabpage_close(int forceit); void tabpage_close_other(tabpage_T *tp, int forceit); void ex_stop(exarg_T *eap);
--- a/src/testdir/test_exit.vim +++ b/src/testdir/test_exit.vim @@ -81,6 +81,18 @@ func Test_exiting() \ readfile('Xtestout')) endif 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 " Test for getting the Vim exit code from v:exiting