diff options
-rw-r--r-- | src/nvim/buffer.c | 32 | ||||
-rw-r--r-- | test/functional/terminal/buffer_spec.lua | 14 |
2 files changed, 29 insertions, 17 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index fdb3ffdc7e..81f8b9073e 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -1218,8 +1218,8 @@ do_buffer( return FAIL; } - if (!forceit && (buf->terminal || bufIsChanged(buf))) { - if ((p_confirm || cmdmod.confirm) && p_write && !buf->terminal) { + if (!forceit && bufIsChanged(buf)) { + if ((p_confirm || cmdmod.confirm) && p_write) { dialog_changed(buf, false); if (!bufref_valid(&bufref)) { // Autocommand deleted buffer, oops! It's not changed now. @@ -1231,22 +1231,22 @@ do_buffer( return FAIL; } } else { - if (buf->terminal) { - if (p_confirm || cmdmod.confirm) { - if (!dialog_close_terminal(buf)) { - return FAIL; - } - } else { - EMSG2(_("E89: %s will be killed (add ! to override)"), - (char *)buf->b_fname); - return FAIL; - } - } else { - EMSGN(_("E89: No write since last change for buffer %" PRId64 - " (add ! to override)"), - buf->b_fnum); + EMSGN(_("E89: No write since last change for buffer %" PRId64 + " (add ! to override)"), + buf->b_fnum); + return FAIL; + } + } + + if (!forceit && buf->terminal && terminal_running(buf->terminal)) { + if (p_confirm || cmdmod.confirm) { + if (!dialog_close_terminal(buf)) { return FAIL; } + } else { + EMSG2(_("E89: %s will be killed (add ! to override)"), + (char *)buf->b_fname); + return FAIL; } } diff --git a/test/functional/terminal/buffer_spec.lua b/test/functional/terminal/buffer_spec.lua index c61bf108cb..16f7fe5178 100644 --- a/test/functional/terminal/buffer_spec.lua +++ b/test/functional/terminal/buffer_spec.lua @@ -7,6 +7,12 @@ local eq, neq = helpers.eq, helpers.neq local write_file = helpers.write_file local command= helpers.command local exc_exec = helpers.exc_exec +local retry = helpers.retry +local funcs = helpers.funcs +local pesc = helpers.pesc +local matches = helpers.matches +local nvim_dir = helpers.nvim_dir +local iswin = helpers.iswin describe(':terminal buffer', function() local screen @@ -255,8 +261,14 @@ describe(':terminal buffer', function() command('bdelete!') end) - it('handles wqall', function() + it("requires bang (!) to close a running job", function() + local cwd = funcs.fnamemodify('.', ':p:~'):gsub([[[\/]*$]], '') + local ext_pat = iswin() and '%.EXE' or '' eq('Vim(wqall):E948: Job still running', exc_exec('wqall')) + matches('^Vim%(bdelete%):E89: term://'..pesc(cwd)..'//%d+:'..nvim_dir..'/tty%-test'..ext_pat..' will be killed %(add %! to override%)$', exc_exec('bdelete')) + command('call jobstop(&channel)') + retry(nil, nil, function() assert(0 >= eval('jobwait([&channel], 1000)[0]')) end) + command('bdelete') end) it('does not segfault when pasting empty buffer #13955', function() |