Mercurial > vim
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