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 -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20220114132025.8E51F1C014A%40moolenaar.net.

Raspunde prin e-mail lui