diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c index d4aa41c76f..49fbb84318 100644 --- a/src/nvim/quickfix.c +++ b/src/nvim/quickfix.c @@ -5996,7 +5996,7 @@ static void wipe_dummy_buffer(buf_T *buf, char *dirname_start) } } if (!did_one) { - return; + goto fail; } } @@ -6018,7 +6018,13 @@ static void wipe_dummy_buffer(buf_T *buf, char *dirname_start) // When autocommands/'autochdir' option changed directory: go back. restore_start_dir(dirname_start); } + + return; } + +fail: + // Keeping the buffer, remove the dummy flag. + buf->b_flags &= ~BF_DUMMY; } /// Unload the dummy buffer that load_dummy_buffer() created. Restores diff --git a/test/old/testdir/test_quickfix.vim b/test/old/testdir/test_quickfix.vim index 130062a39d..000526780f 100644 --- a/test/old/testdir/test_quickfix.vim +++ b/test/old/testdir/test_quickfix.vim @@ -6799,4 +6799,23 @@ func Test_vimgrep_dummy_buffer_crash() %bw! endfunc +func Test_vimgrep_dummy_buffer_keep() + augroup DummyKeep + autocmd! + " Trigger a wipe of the dummy buffer by aborting script processing. Prevent + " wiping it by splitting it from the autocmd window into an only window. + autocmd BufReadCmd * ++once let s:dummy_buf = bufnr() + \| tab split | call interrupt() + augroup END + + call assert_fails('vimgrep /./ .') + call assert_equal(1, bufexists(s:dummy_buf)) + " Ensure it's no longer considered a dummy; should be able to switch to it. + execute s:dummy_buf 'sbuffer' + + unlet! s:dummy_buf + autocmd! DummyKeep + %bw! +endfunc + " vim: shiftwidth=2 sts=2 expandtab