Mercurial > vim
changeset 15643:dc2bfda59f95 v8.1.0829
patch 8.1.0829: when 'hidden' is set session creates extra buffers
commit https://github.com/vim/vim/commit/d39e275b57493f9e25e1b62f84810571eee30cf4
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Jan 26 20:07:38 2019 +0100
patch 8.1.0829: when 'hidden' is set session creates extra buffers
Problem: When 'hidden' is set session creates extra buffers.
Solution: Move :badd commands to the end. (Jason Franklin)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 26 Jan 2019 20:15:11 +0100 |
parents | 35cfcded325d |
children | fb81e4e5a38b |
files | src/ex_docmd.c src/testdir/test_mksession.vim src/version.c |
diffstat | 3 files changed, 48 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -11280,26 +11280,6 @@ makeopens( if (put_line(fd, "set shortmess=aoO") == FAIL) return FAIL; - /* Now put the other buffers into the buffer list */ - FOR_ALL_BUFFERS(buf) - { - if (!(only_save_windows && buf->b_nwindows == 0) - && !(buf->b_help && !(ssop_flags & SSOP_HELP)) -#ifdef FEAT_TERMINAL - /* skip terminal buffers: finished ones are not useful, others - * will be resurrected and result in a new buffer */ - && !bt_terminal(buf) -#endif - && buf->b_fname != NULL - && buf->b_p_bl) - { - if (fprintf(fd, "badd +%ld ", buf->b_wininfo == NULL ? 1L - : buf->b_wininfo->wi_fpos.lnum) < 0 - || ses_fname(fd, buf, &ssop_flags, TRUE) == FAIL) - return FAIL; - } - } - /* the global argument list */ if (ses_arglist(fd, "argglobal", &global_alist.al_ga, !(ssop_flags & SSOP_CURDIR), &ssop_flags) == FAIL) @@ -11515,6 +11495,29 @@ makeopens( if (restore_stal && put_line(fd, "set stal=1") == FAIL) return FAIL; + // Now put the remaining buffers into the buffer list. + // This is near the end, so that when 'hidden' is set we don't create extra + // buffers. If the buffer was already created with another command the + // ":badd" will have no effect. + FOR_ALL_BUFFERS(buf) + { + if (!(only_save_windows && buf->b_nwindows == 0) + && !(buf->b_help && !(ssop_flags & SSOP_HELP)) +#ifdef FEAT_TERMINAL + // Skip terminal buffers: finished ones are not useful, others + // will be resurrected and result in a new buffer. + && !bt_terminal(buf) +#endif + && buf->b_fname != NULL + && buf->b_p_bl) + { + if (fprintf(fd, "badd +%ld ", buf->b_wininfo == NULL ? 1L + : buf->b_wininfo->wi_fpos.lnum) < 0 + || ses_fname(fd, buf, &ssop_flags, TRUE) == FAIL) + return FAIL; + } + } + /* * Wipe out an empty unnamed buffer we started in. */
--- a/src/testdir/test_mksession.vim +++ b/src/testdir/test_mksession.vim @@ -225,6 +225,29 @@ func Test_mksession_blank_tabs() call delete('Xtest_mks.out') endfunc +func Test_mksession_buffer_count() + set hidden + + " Edit exactly three files in the current session. + %bwipe! + e Xfoo | tabe Xbar | tabe Xbaz + tabdo write + mksession! Xtest_mks.out + + " Verify that loading the session does not create additional buffers. + %bwipe! + source Xtest_mks.out + call assert_equal(3, len(getbufinfo())) + + " Clean up. + call delete('Xfoo') + call delete('Xbar') + call delete('Xbaz') + call delete('Xtest_mks.out') + %bwipe! + set hidden& +endfunc + if has('extra_search') func Test_mksession_hlsearch()