To: vim_dev@googlegroups.com Subject: Patch 8.2.4090 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.4090 Problem: After restoring a session buffer order can be quite different. Solution: Create buffers first. (Evgeni Chasnovski, closes #9520) Files: src/session.c, src/testdir/test_mksession.vim *** ../vim-8.2.4089/src/session.c 2022-01-05 14:01:27.226992349 +0000 --- src/session.c 2022-01-14 13:17:55.551030574 +0000 *************** *** 690,695 **** --- 690,717 ---- if (put_line(fd, "set shortmess=aoO") == FAIL) goto fail; + // Put all buffers into the buffer list. + // Do it very early to preserve buffer order after loading session (which + // can be disrupted by prior `edit` or `tabedit` calls). + 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) + goto fail; + } + } + // the global argument list if (ses_arglist(fd, "argglobal", &global_alist.al_ga, !(ssop_flags & SSOP_CURDIR), &ssop_flags) == FAIL) *************** *** 741,747 **** // Similar to ses_win_rec() below, populate the tab pages first so // later local options won't be copied to the new tabs. FOR_ALL_TABPAGES(tp) ! if (tp->tp_next != NULL && put_line(fd, "tabnew") == FAIL) goto fail; if (first_tabpage->tp_next != NULL && put_line(fd, "tabrewind") == FAIL) goto fail; --- 763,773 ---- // Similar to ses_win_rec() below, populate the tab pages first so // later local options won't be copied to the new tabs. FOR_ALL_TABPAGES(tp) ! // Use `bufhidden=wipe` to remove empty "placeholder" buffers once ! // they are not needed. This prevents creating extra buffers (see ! // cause of patch 8.1.0829) ! if (tp->tp_next != NULL ! && put_line(fd, "tabnew +setlocal\\ bufhidden=wipe") == FAIL) goto fail; if (first_tabpage->tp_next != NULL && put_line(fd, "tabrewind") == FAIL) goto fail; *************** *** 919,947 **** if (restore_stal && put_line(fd, "set stal=1") == FAIL) goto 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) - goto fail; - } - } - // Wipe out an empty unnamed buffer we started in. if (put_line(fd, "if exists('s:wipebuf') && len(win_findbuf(s:wipebuf)) == 0") == FAIL) --- 945,950 ---- *** ../vim-8.2.4089/src/testdir/test_mksession.vim 2022-01-05 14:01:27.230992328 +0000 --- src/testdir/test_mksession.vim 2022-01-14 13:15:18.527351241 +0000 *************** *** 362,367 **** --- 362,392 ---- set hidden& endfunc + func Test_mksession_buffer_order() + %bwipe! + e Xfoo | e Xbar | e Xbaz | e Xqux + bufdo write + mksession! Xtest_mks.out + + " Verify that loading the session preserves order of buffers + %bwipe! + source Xtest_mks.out + + let s:buf_info = getbufinfo() + call assert_true(s:buf_info[0]['name'] =~# 'Xfoo$') + call assert_true(s:buf_info[1]['name'] =~# 'Xbar$') + call assert_true(s:buf_info[2]['name'] =~# 'Xbaz$') + call assert_true(s:buf_info[3]['name'] =~# 'Xqux$') + + " Clean up. + call delete('Xfoo') + call delete('Xbar') + call delete('Xbaz') + call delete('Xqux') + call delete('Xtest_mks.out') + %bwipe! + endfunc + if has('extra_search') func Test_mksession_hlsearch() *** ../vim-8.2.4089/src/version.c 2022-01-14 12:06:43.731420951 +0000 --- src/version.c 2022-01-14 13:17:05.327129994 +0000 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 4090, /**/ -- Not too long ago, compress was something you did to garbage... /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///