]> granicus.if.org Git - vim/commitdiff
patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright' v8.2.2776
authorBram Moolenaar <Bram@vim.org>
Sat, 17 Apr 2021 16:38:54 +0000 (18:38 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 17 Apr 2021 16:38:54 +0000 (18:38 +0200)
Problem:    :mksession uses current value of 'splitbelow' and 'splitright'
            even though "options" is not in 'sessionoptions'. (Maxim Kim)
Solution:   Save and restore the values, instead of setting to the current
            value. (closes #8119)

src/session.c
src/testdir/test_mksession.vim
src/version.c

index 4475ca019ac033ebf45a069960b232b0d36f7202..6d1ccb57e2019a4f6403e5d2f3770550cbe98a9c 100644 (file)
@@ -779,15 +779,22 @@ makeopens(
        if (need_tabnext && put_line(fd, "tabnext") == FAIL)
            goto fail;
 
-       // Save current window layout.
-       if (put_line(fd, "set splitbelow splitright") == FAIL)
-           goto fail;
-       if (ses_win_rec(fd, tab_topframe) == FAIL)
-           goto fail;
-       if (!p_sb && put_line(fd, "set nosplitbelow") == FAIL)
-           goto fail;
-       if (!p_spr && put_line(fd, "set nosplitright") == FAIL)
-           goto fail;
+       if (tab_topframe->fr_layout != FR_LEAF)
+       {
+           // Save current window layout.
+           if (put_line(fd, "let s:save_splitbelow = &splitbelow") == FAIL
+                   || put_line(fd, "let s:save_splitright = &splitright")
+                                                                      == FAIL)
+               goto fail;
+           if (put_line(fd, "set splitbelow splitright") == FAIL)
+               goto fail;
+           if (ses_win_rec(fd, tab_topframe) == FAIL)
+               goto fail;
+           if (put_line(fd, "let &splitbelow = s:save_splitbelow") == FAIL
+                   || put_line(fd, "let &splitright = s:save_splitright")
+                                                                      == FAIL)
+               goto fail;
+       }
 
        // Check if window sizes can be restored (no windows omitted).
        // Remember the window number of the current window after restoring.
@@ -802,22 +809,29 @@ makeopens(
                cnr = nr;
        }
 
-       // Go to the first window.
-       if (put_line(fd, "wincmd t") == FAIL)
-           goto fail;
+       if (tab_firstwin->w_next != NULL)
+       {
+           // Go to the first window.
+           if (put_line(fd, "wincmd t") == FAIL)
+               goto fail;
 
-       // If more than one window, see if sizes can be restored.
-       // First set 'winheight' and 'winwidth' to 1 to avoid the windows being
-       // resized when moving between windows.
-       // Do this before restoring the view, so that the topline and the
-       // cursor can be set.  This is done again below.
-       // winminheight and winminwidth need to be set to avoid an error if the
-       // user has set winheight or winwidth.
-       if (put_line(fd, "set winminheight=0") == FAIL
-               || put_line(fd, "set winheight=1") == FAIL
-               || put_line(fd, "set winminwidth=0") == FAIL
-               || put_line(fd, "set winwidth=1") == FAIL)
-           goto fail;
+           // If more than one window, see if sizes can be restored.
+           // First set 'winheight' and 'winwidth' to 1 to avoid the windows
+           // being resized when moving between windows.
+           // Do this before restoring the view, so that the topline and the
+           // cursor can be set.  This is done again below.
+           // winminheight and winminwidth need to be set to avoid an error if
+           // the user has set winheight or winwidth.
+           if (put_line(fd, "let s:save_winminheight = &winminheight") == FAIL
+                   || put_line(fd, "let s:save_winminwidth = &winminwidth")
+                                                                      == FAIL)
+               goto fail;
+           if (put_line(fd, "set winminheight=0") == FAIL
+                   || put_line(fd, "set winheight=1") == FAIL
+                   || put_line(fd, "set winminwidth=0") == FAIL
+                   || put_line(fd, "set winwidth=1") == FAIL)
+               goto fail;
+       }
        if (nr > 1 && ses_winsizes(fd, restore_size, tab_firstwin) == FAIL)
            goto fail;
 
@@ -919,10 +933,13 @@ makeopens(
     if (fprintf(fd, "set winheight=%ld winwidth=%ld shortmess=%s",
                               p_wh, p_wiw, p_shm) < 0 || put_eol(fd) == FAIL)
        goto fail;
-    // Re-apply 'winminheight' and 'winminwidth'.
-    if (fprintf(fd, "set winminheight=%ld winminwidth=%ld",
-                                     p_wmh, p_wmw) < 0 || put_eol(fd) == FAIL)
-       goto fail;
+    if (tab_firstwin->w_next != NULL)
+    {
+       // Restore 'winminheight' and 'winminwidth'.
+       if (put_line(fd, "let &winminheight = s:save_winminheight") == FAIL
+             || put_line(fd, "let &winminwidth = s:save_winminwidth") == FAIL)
+           goto fail;
+    }
 
     // Lastly, execute the x.vim file if it exists.
     if (put_line(fd, "let s:sx = expand(\"<sfile>:p:r\").\"x.vim\"") == FAIL
index 8eed111a85dd268c68994ea8f640850cdad295a1..25c508102be33f3b05d0a745e0c192be0bcbb3ff 100644 (file)
@@ -911,6 +911,24 @@ func Test_mksession_winpos()
   set sessionoptions&
 endfunc
 
+" Test for mksession without options restores winminheight
+func Test_mksession_winminheight()
+  set sessionoptions-=options
+  split
+  mksession! Xtest_mks.out
+  let found_restore = 0
+  let lines = readfile('Xtest_mks.out')
+  for line in lines
+    if line =~ '= s:save_winmin\(width\|height\)'
+      let found_restore += 1
+    endif
+  endfor
+  call assert_equal(2, found_restore)
+  call delete('Xtest_mks.out')
+  close
+  set sessionoptions&
+endfunc
+
 " Test for mksession with 'compatible' option
 func Test_mksession_compatible()
   mksession! Xtest_mks1.out
index 3f3b2c91f84dbdf59e720eb69d582ed73c2e5aad..e1f15264ef3025a2225bbaea0346b70c1b5210d0 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2776,
 /**/
     2775,
 /**/