diff options
-rw-r--r-- | src/nvim/buffer.c | 3 | ||||
-rw-r--r-- | src/nvim/ex_cmds.c | 5 | ||||
-rw-r--r-- | test/functional/api/buffer_updates_spec.lua | 26 |
3 files changed, 31 insertions, 3 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index 7fd4326914..6ae239c9c3 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -591,7 +591,8 @@ void close_buffer(win_T *win, buf_T *buf, int action, int abort_if_last) /* Change directories when the 'acd' option is set. */ do_autochdir(); - // disable buffer updates for the current buffer + // Disable buffer-updates for the current buffer. + // No need to check `unload_buf`: in that case the function returned above. buf_updates_unregister_all(buf); /* diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index 97bddb3258..2a5793f0d4 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -2476,8 +2476,8 @@ int do_ecmd( } set_bufref(&bufref, buf); if (p_ur < 0 || curbuf->b_ml.ml_line_count <= p_ur) { - /* Save all the text, so that the reload can be undone. - * Sync first so that this is a separate undo-able action. */ + // Save all the text, so that the reload can be undone. + // Sync first so that this is a separate undo-able action. u_sync(false); if (u_savecommon(0, curbuf->b_ml.ml_line_count + 1, 0, true) == FAIL) { @@ -2491,6 +2491,7 @@ int do_ecmd( // Tell readfile() not to clear or reload undo info. readfile_flags = READ_KEEP_UNDO; } else { + buf_updates_unregister_all(curbuf); buf_freeall(curbuf, 0); // Free all things for buffer. } // If autocommands deleted the buffer we were going to re-edit, give diff --git a/test/functional/api/buffer_updates_spec.lua b/test/functional/api/buffer_updates_spec.lua index b54d9e1f6e..b894d2facd 100644 --- a/test/functional/api/buffer_updates_spec.lua +++ b/test/functional/api/buffer_updates_spec.lua @@ -678,6 +678,32 @@ describe('API: buffer events:', function() expectn('Hello There', {}) end) + it(':edit! (reload) causes detach #9642', function() + local b, tick = editoriginal(true, {'AAA', 'BBB'}) + command('set undoreload=1') + + command('normal! x') + tick = tick + 1 + expectn('nvim_buf_lines_event', {b, tick, 0, 1, {'AA'}, false}) + + command('edit!') + expectn('nvim_buf_detach_event', {b}) + end) + + it(':enew! does not detach hidden buffer', function() + local b, tick = editoriginal(true, {'AAA', 'BBB'}) + local channel = nvim('get_api_info')[1] + + command('set undoreload=1 hidden') + command('normal! x') + tick = tick + 1 + expectn('nvim_buf_lines_event', {b, tick, 0, 1, {'AA'}, false}) + + command('enew!') + eval('rpcnotify('..channel..', "Hello There")') + expectn('Hello There', {}) + end) + it('stays attached if the buffer is hidden', function() local b, tick = editoriginal(true, {'AAA'}) local channel = nvim('get_api_info')[1] |