]> granicus.if.org Git - vim/commitdiff
patch 8.2.0769: VimLeavePre not triggered when Vim is terminated v8.2.0769
authorBram Moolenaar <Bram@vim.org>
Sat, 16 May 2020 14:08:35 +0000 (16:08 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 16 May 2020 14:08:35 +0000 (16:08 +0200)
Problem:    VimLeavePre not triggered when Vim is terminated.
Solution:   Unblock autocommands.

src/main.c
src/testdir/test_signals.vim
src/version.c

index b00d7b987f5aab978c44e82bb9be08c4cda1dec5..201ed372117794c5356c14a93754e5113eb6dcc9 100644 (file)
@@ -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
index 0008e31fb753797f47a85239e175c016a5cc6061..48e3a3e0e4f12ab43bfa93ce946f37d065bebcc6 100644 (file)
@@ -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
index 8c89761bb9aacd38b4f385edf3ad652080a3e051..a1b038f15779fa32113657f83f9ec43d5e53a3ab 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    769,
 /**/
     768,
 /**/