aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2015-11-27 18:06:52 -0500
committerJustin M. Keyes <justinkz@gmail.com>2015-11-27 18:06:52 -0500
commitb9139e009f3eb833ab57e73d1ecdbe68752112fe (patch)
tree97c5556dfeb9cc745db844509946d7cfc12a57c5
parent951714ede63beb324c3ffb4d326ba1c5a47a36ea (diff)
parentec8e60a055d75d7c78242957c87f574e360273a2 (diff)
downloadrneovim-b9139e009f3eb833ab57e73d1ecdbe68752112fe.tar.gz
rneovim-b9139e009f3eb833ab57e73d1ecdbe68752112fe.tar.bz2
rneovim-b9139e009f3eb833ab57e73d1ecdbe68752112fe.zip
Merge pull request #3724 from ZyX-I/fix-3635
shada: Do not save unlisted and quickfix buffers
-rw-r--r--runtime/doc/options.txt6
-rw-r--r--src/nvim/shada.c9
-rw-r--r--test/functional/shada/buffers_spec.lua43
3 files changed, 51 insertions, 7 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 02fe971f6a..bbf3da8de7 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -5303,9 +5303,9 @@ A jump table for the options with a short description can be found at |Q_op|.
% When included, save and restore the buffer list. If Vim is
started with a file name argument, the buffer list is not
restored. If Vim is started without a file name argument, the
- buffer list is restored from the shada file. Buffers
- without a file name and buffers for help files are not written
- to the shada file.
+ buffer list is restored from the shada file. Quickfix
+ ('buftype'), unlisted ('buflisted'), unnamed and buffers on
+ removable media (|shada-r|) are not saved.
When followed by a number, the number specifies the maximum
number of buffers that are stored. Without a number all
buffers are stored.
diff --git a/src/nvim/shada.c b/src/nvim/shada.c
index 231dad07e5..e21c6f17fe 100644
--- a/src/nvim/shada.c
+++ b/src/nvim/shada.c
@@ -43,6 +43,7 @@
#include "nvim/path.h"
#include "nvim/fileio.h"
#include "nvim/strings.h"
+#include "nvim/quickfix.h"
#include "nvim/lib/khash.h"
#include "nvim/lib/kvec.h"
@@ -2484,8 +2485,11 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer,
// Write buffer list
if (find_shada_parameter('%') != NULL) {
size_t buf_count = 0;
+#define IGNORE_BUF(buf)\
+ (buf->b_ffname == NULL || !buf->b_p_bl || bt_quickfix(buf) \
+ || in_bufset(&removable_bufs, buf))
FOR_ALL_BUFFERS(buf) {
- if (buf->b_ffname != NULL && !in_bufset(&removable_bufs, buf)) {
+ if (!IGNORE_BUF(buf)) {
buf_count++;
}
}
@@ -2503,7 +2507,7 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer,
};
size_t i = 0;
FOR_ALL_BUFFERS(buf) {
- if (buf->b_ffname == NULL || in_bufset(&removable_bufs, buf)) {
+ if (IGNORE_BUF(buf)) {
continue;
}
buflist_entry.data.buffer_list.buffers[i] = (struct buffer_list_buffer) {
@@ -2519,6 +2523,7 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer,
goto shada_write_exit;
}
xfree(buflist_entry.data.buffer_list.buffers);
+#undef IGNORE_BUF
}
// Write some of the variables
diff --git a/test/functional/shada/buffers_spec.lua b/test/functional/shada/buffers_spec.lua
index fd0c5e9a39..fd4809e01a 100644
--- a/test/functional/shada/buffers_spec.lua
+++ b/test/functional/shada/buffers_spec.lua
@@ -1,7 +1,7 @@
-- ShaDa buffer list saving/reading support
local helpers = require('test.functional.helpers')
-local nvim_command, funcs, eq =
- helpers.command, helpers.funcs, helpers.eq
+local nvim_command, funcs, eq, curbufmeths =
+ helpers.command, helpers.funcs, helpers.eq, helpers.curbufmeths
local shada_helpers = require('test.functional.shada.helpers')
local reset, set_additional_cmd, clear =
@@ -48,4 +48,43 @@ describe('ShaDa support code', function()
eq(1, funcs.bufnr('$'))
eq('', funcs.bufname(1))
end)
+
+ it('does not dump unlisted buffer', function()
+ set_additional_cmd('set shada+=%')
+ reset()
+ nvim_command('edit ' .. testfilename)
+ nvim_command('edit ' .. testfilename_2)
+ curbufmeths.set_option('buflisted', false)
+ nvim_command('qall')
+ reset()
+ eq(2, funcs.bufnr('$'))
+ eq('', funcs.bufname(1))
+ eq(testfilename, funcs.bufname(2))
+ end)
+
+ it('does not dump quickfix buffer', function()
+ set_additional_cmd('set shada+=%')
+ reset()
+ nvim_command('edit ' .. testfilename)
+ nvim_command('edit ' .. testfilename_2)
+ curbufmeths.set_option('buftype', 'quickfix')
+ nvim_command('qall')
+ reset()
+ eq(2, funcs.bufnr('$'))
+ eq('', funcs.bufname(1))
+ eq(testfilename, funcs.bufname(2))
+ end)
+
+ it('does not dump unnamed buffers', function()
+ set_additional_cmd('set shada+=% hidden')
+ reset()
+ curbufmeths.set_line(0, 'foo')
+ nvim_command('enew')
+ curbufmeths.set_line(0, 'bar')
+ eq(2, funcs.bufnr('$'))
+ nvim_command('qall!')
+ reset()
+ eq(1, funcs.bufnr('$'))
+ eq('', funcs.bufname(1))
+ end)
end)