changeset 20429:c88ebfcbab03 v8.2.0769

patch 8.2.0769: VimLeavePre not triggered when Vim is terminated Commit: https://github.com/vim/vim/commit/129d6bf6b3d120b0a4c69e18b5e8602a84e352bf Author: Bram Moolenaar <Bram@vim.org> Date: Sat May 16 16:08:35 2020 +0200 patch 8.2.0769: VimLeavePre not triggered when Vim is terminated Problem: VimLeavePre not triggered when Vim is terminated. Solution: Unblock autocommands.
author Bram Moolenaar <Bram@vim.org>
date Sat, 16 May 2020 16:15:04 +0200
parents 780f1b382dca
children df50f7b7830d
files src/main.c src/testdir/test_signals.vim src/version.c
diffstat 3 files changed, 25 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/main.c
+++ b/src/main.c
@@ -1576,6 +1576,7 @@ getout(int exitval)
 	tabpage_T	*next_tp;
 	buf_T		*buf;
 	win_T		*wp;
+	int		unblock = 0;
 
 	// Trigger BufWinLeave for all windows, but only once per buffer.
 	for (tp = first_tabpage; tp != NULL; tp = next_tp)
@@ -1617,7 +1618,17 @@ getout(int exitval)
 		    // autocmd deleted the buffer
 		    break;
 	    }
+
+	// deathtrap() blocks autocommands, but we do want to trigger
+	// VimLeavePre.
+	if (is_autocmd_blocked())
+	{
+	    unblock_autocmds();
+	    ++unblock;
+	}
 	apply_autocmds(EVENT_VIMLEAVEPRE, NULL, NULL, FALSE, curbuf);
+	if (unblock)
+	    block_autocmds();
     }
 
 #ifdef FEAT_VIMINFO
--- a/src/testdir/test_signals.vim
+++ b/src/testdir/test_signals.vim
@@ -127,8 +127,13 @@ func Test_deadly_signal_TERM()
   if cmd =~ 'valgrind'
     throw 'Skipped: cannot test signal TERM with valgrind'
   endif
+  let lines =<< trim END
+    au VimLeave * call writefile(["VimLeave triggered"], "XautoOut", "a")
+    au VimLeavePre * call writefile(["VimLeavePre triggered"], "XautoOut", "a")
+  END
+  call writefile(lines, 'XsetupAucmd')
 
-  let buf = RunVimInTerminal('Xsig_TERM', {'rows': 6})
+  let buf = RunVimInTerminal('-S XsetupAucmd Xsig_TERM', {'rows': 6})
   let pid_vim = term_getjob(buf)->job_info().process
 
   call term_sendkeys(buf, ":call setline(1, 'foo')\n")
@@ -145,8 +150,14 @@ func Test_deadly_signal_TERM()
   silent recover .Xsig_TERM.swp
   call assert_equal(['foo'], getline(1, '$'))
 
+  let result = readfile('XautoOut')
+  call assert_match('VimLeavePre triggered', result[0])
+  call assert_match('VimLeave triggered', result[1])
+
   %bwipe!
   call delete('.Xsig_TERM.swp')
+  call delete('XsetupAucmd')
+  call delete('XautoOut')
 endfunc
 
 " vim: ts=8 sw=2 sts=2 tw=80 fdm=marker
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    769,
+/**/
     768,
 /**/
     767,