mirror of
https://github.com/neovim/neovim.git
synced 2026-02-22 18:30:39 +10:00
fix(terminal): crash when TermClose deletes other buffers
Problem: Crash when deleting terminal buffer and TermClose deletes
other buffers.
Solution: Close the terminal after restoring b_nwindows.
(cherry picked from commit 7297e9d339)
This commit is contained in:
committed by
github-actions[bot]
parent
26db87652e
commit
2cc78732fc
@@ -636,10 +636,6 @@ bool close_buffer(win_T *win, buf_T *buf, int action, bool abort_if_last, bool i
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buf->terminal) {
|
|
||||||
buf_close_terminal(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Always remove the buffer when there is no file name.
|
// Always remove the buffer when there is no file name.
|
||||||
if (buf->b_ffname == NULL) {
|
if (buf->b_ffname == NULL) {
|
||||||
del_buf = true;
|
del_buf = true;
|
||||||
@@ -663,6 +659,15 @@ bool close_buffer(win_T *win, buf_T *buf, int action, bool abort_if_last, bool i
|
|||||||
|
|
||||||
buf->b_nwindows = nwindows;
|
buf->b_nwindows = nwindows;
|
||||||
|
|
||||||
|
if (buf->terminal) {
|
||||||
|
buf_close_terminal(buf);
|
||||||
|
// Must check this before calling buf_freeall(), otherwise is_curbuf will be true
|
||||||
|
// in buf_freeall() but still false here, leading to a 0-line buffer.
|
||||||
|
if (buf == curbuf && !is_curbuf) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
buf_freeall(buf, ((del_buf ? BFA_DEL : 0)
|
buf_freeall(buf, ((del_buf ? BFA_DEL : 0)
|
||||||
+ (wipe_buf ? BFA_WIPE : 0)
|
+ (wipe_buf ? BFA_WIPE : 0)
|
||||||
+ (ignore_abort ? BFA_IGNORE_ABORT : 0)));
|
+ (ignore_abort ? BFA_IGNORE_ABORT : 0)));
|
||||||
|
|||||||
@@ -45,6 +45,18 @@ describe('autocmd TermClose', function()
|
|||||||
test_termclose_delete_own_buf()
|
test_termclose_delete_own_buf()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('TermClose deleting all other buffers', function()
|
||||||
|
local oldbuf = api.nvim_get_current_buf()
|
||||||
|
-- The terminal process needs to keep running so that TermClose isn't triggered immediately.
|
||||||
|
api.nvim_set_option_value('shell', string.format('"%s" INTERACT', testprg('shell-test')), {})
|
||||||
|
command(('autocmd TermClose * bdelete! %d'):format(oldbuf))
|
||||||
|
command('horizontal terminal')
|
||||||
|
neq(oldbuf, api.nvim_get_current_buf())
|
||||||
|
command('bdelete!')
|
||||||
|
feed('<C-G>') -- This shouldn't crash due to having a 0-line buffer.
|
||||||
|
assert_alive()
|
||||||
|
end)
|
||||||
|
|
||||||
it('triggers when fast-exiting terminal job stops', function()
|
it('triggers when fast-exiting terminal job stops', function()
|
||||||
command('autocmd TermClose * let g:test_termclose = 23')
|
command('autocmd TermClose * let g:test_termclose = 23')
|
||||||
command('terminal')
|
command('terminal')
|
||||||
|
|||||||
Reference in New Issue
Block a user