# HG changeset patch # User Christian Brabandt # Date 1511272806 -3600 # Node ID 411a30bd7e8a7b989c5c9cd6d82ab5d8d6ea570d # Parent 9e528acde057b24bce165c8c4f4abf97a2e97b89 patch 8.0.1328: trouble when using ":term ++close" with autocmd commit https://github.com/vim/vim/commit/ff5467965e3871d3dc0288416fcc6b1e2ba4f822 Author: Bram Moolenaar Date: Tue Nov 21 14:47:57 2017 +0100 patch 8.0.1328: trouble when using ":term ++close" with autocmd Problem: Trouble when using ":term ++close" with autocmd. (Gabriel Barta) Solution: Use aucmd_prepbuf() and aucmd_restbuf() instead of setting curbuf. (closes #2339) diff --git a/src/terminal.c b/src/terminal.c --- a/src/terminal.c +++ b/src/terminal.c @@ -51,6 +51,7 @@ * - implement term_setsize() * - Termdebug does not work when Vim build with mzscheme. gdb hangs. * - MS-Windows GUI: WinBar has tearoff item + * - Adding WinBar to terminal window doesn't display, text isn't shifted down. * - MS-Windows GUI: still need to type a key after shell exits? #1924 * - After executing a shell command the status line isn't redraw. * - What to store in a session file? Shell at the prompt would be OK to @@ -2172,10 +2173,13 @@ term_channel_closed(channel_T *ch) if (term->tl_finish == 'c') { + aco_save_T aco; + /* ++close or term_finish == "close" */ ch_log(NULL, "terminal job finished, closing window"); - curbuf = term->tl_buffer; + aucmd_prepbuf(&aco, term->tl_buffer); do_bufdel(DOBUF_WIPE, (char_u *)"", 1, fnum, fnum, FALSE); + aucmd_restbuf(&aco); break; } if (term->tl_finish == 'o' && term->tl_buffer->b_nwindows == 0) diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim --- a/src/testdir/test_terminal.vim +++ b/src/testdir/test_terminal.vim @@ -352,9 +352,7 @@ func Test_terminal_curwin() call delete('Xtext') endfunc -func Test_finish_open_close() - call assert_equal(1, winnr('$')) - +func s:get_sleep_cmd() if s:python != '' let cmd = s:python . " test_short_sleep.py" let waittime = 500 @@ -367,12 +365,18 @@ func Test_finish_open_close() let cmd = 'sleep 1' endif endif + return [cmd, waittime] +endfunc + +func Test_terminal_finish_open_close() + call assert_equal(1, winnr('$')) + + let [cmd, waittime] = s:get_sleep_cmd() exe 'terminal ++close ' . cmd call assert_equal(2, winnr('$')) wincmd p call WaitFor("winnr('$') == 1", waittime) - call assert_equal(1, winnr('$')) call term_start(cmd, {'term_finish': 'close'}) call assert_equal(2, winnr('$')) @@ -743,3 +747,29 @@ func Test_terminal_composing_unicode() unlet g:job let &encoding = save_enc endfunc + +func Test_terminal_aucmd_on_close() + fun Nop() + let s:called = 1 + endfun + + aug repro + au! + au BufWinLeave * call Nop() + aug END + + let [cmd, waittime] = s:get_sleep_cmd() + + call assert_equal(1, winnr('$')) + new + call setline(1, ['one', 'two']) + exe 'term ++close ' . cmd + wincmd p + call WaitFor("winnr('$') == 2", waittime) + call assert_equal(1, s:called) + bwipe! + + unlet s:called + au! repro + delfunc Nop +endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -772,6 +772,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1328, +/**/ 1327, /**/ 1326,