]> granicus.if.org Git - vim/commitdiff
patch 8.0.1024: folds lost when session file has a buffer in two windows v8.0.1024
authorBram Moolenaar <Bram@vim.org>
Wed, 30 Aug 2017 19:07:38 +0000 (21:07 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 30 Aug 2017 19:07:38 +0000 (21:07 +0200)
Problem:    Manual folds are lost when a session file has the same buffer in
            two windows. (Jeansen)
Solution:   Use ":edit" only once. (Christian Brabandt, closes #1958)

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

index 70f3e573d958a7df683628f0de6948ce8ca0b9ee..0bcb7fec50c5eb090952dc00a78468c6628ceabf 100644 (file)
@@ -11099,7 +11099,7 @@ static int ses_do_frame(frame_T *fr);
 static int ses_do_win(win_T *wp);
 static int ses_arglist(FILE *fd, char *cmd, garray_T *gap, int fullname, unsigned *flagp);
 static int ses_put_fname(FILE *fd, char_u *name, unsigned *flagp);
-static int ses_fname(FILE *fd, buf_T *buf, unsigned *flagp);
+static int ses_fname(FILE *fd, buf_T *buf, unsigned *flagp, int add_eol);
 
 /*
  * Write openfile commands for the current buffers to an .exrc file.
@@ -11195,7 +11195,7 @@ makeopens(
        {
            if (fprintf(fd, "badd +%ld ", buf->b_wininfo == NULL ? 1L
                                           : buf->b_wininfo->wi_fpos.lnum) < 0
-                   || ses_fname(fd, buf, &ssop_flags) == FAIL)
+                   || ses_fname(fd, buf, &ssop_flags, TRUE) == FAIL)
                return FAIL;
        }
     }
@@ -11289,7 +11289,8 @@ makeopens(
                    )
            {
                if (fputs(need_tabnew ? "tabedit " : "edit ", fd) < 0
-                       || ses_fname(fd, wp->w_buffer, &ssop_flags) == FAIL)
+                             || ses_fname(fd, wp->w_buffer, &ssop_flags, TRUE)
+                                                                      == FAIL)
                    return FAIL;
                need_tabnew = FALSE;
                if (!wp->w_arg_idx_invalid)
@@ -11636,9 +11637,20 @@ put_view(
            /*
             * Editing a file in this buffer: use ":edit file".
             * This may have side effects! (e.g., compressed or network file).
+            *
+            * Note, if a buffer for that file already exists, use :badd to
+            * edit that buffer, to not lose folding information (:edit resets
+            * folds in other buffers)
             */
-           if (fputs("edit ", fd) < 0
-                   || ses_fname(fd, wp->w_buffer, flagp) == FAIL)
+           if (fputs("if bufexists('", fd) < 0
+                   || ses_fname(fd, wp->w_buffer, flagp, FALSE) == FAIL
+                   || fputs("') | buffer ", fd) < 0
+                   || ses_fname(fd, wp->w_buffer, flagp, FALSE) == FAIL
+                   || fputs(" | else | edit ", fd) < 0
+                   || ses_fname(fd, wp->w_buffer, flagp, FALSE) == FAIL
+                   || fputs(" | endif", fd) < 0
+                   ||
+               put_eol(fd) == FAIL)
                return FAIL;
        }
        else
@@ -11651,7 +11663,7 @@ put_view(
            {
                /* The buffer does have a name, but it's not a file name. */
                if (fputs("file ", fd) < 0
-                       || ses_fname(fd, wp->w_buffer, flagp) == FAIL)
+                       || ses_fname(fd, wp->w_buffer, flagp, TRUE) == FAIL)
                    return FAIL;
            }
 #endif
@@ -11823,11 +11835,11 @@ ses_arglist(
 
 /*
  * Write a buffer name to the session file.
- * Also ends the line.
+ * Also ends the line, if "add_eol" is TRUE.
  * Returns FAIL if writing fails.
  */
     static int
-ses_fname(FILE *fd, buf_T *buf, unsigned *flagp)
+ses_fname(FILE *fd, buf_T *buf, unsigned *flagp, int add_eol)
 {
     char_u     *name;
 
@@ -11846,7 +11858,8 @@ ses_fname(FILE *fd, buf_T *buf, unsigned *flagp)
        name = buf->b_sfname;
     else
        name = buf->b_ffname;
-    if (ses_put_fname(fd, name, flagp) == FAIL || put_eol(fd) == FAIL)
+    if (ses_put_fname(fd, name, flagp) == FAIL
+           || (add_eol && put_eol(fd) == FAIL))
        return FAIL;
     return OK;
 }
index 6ea3255dff3657e3c77859fb389f68dafef9b71a..afbc7607cb030d23dbc45b3083280aa369153557 100644 (file)
@@ -121,5 +121,36 @@ func Test_mksession_arglist()
   argdel *
 endfunc
 
+func Test_mksession_one_buffer_two_windows()
+  edit Xtest1
+  new Xtest2
+  split
+  mksession! Xtest_mks.out
+  let lines = readfile('Xtest_mks.out')
+  let count1 = 0
+  let count2 = 0
+  let count2buf = 0
+  for line in lines
+    if line =~ 'edit \f*Xtest1$'
+      let count1 += 1
+    endif
+    if line =~ 'edit \f\{-}Xtest2'
+      let count2 += 1
+    endif
+    if line =~ 'buffer \f\{-}Xtest2'
+      let count2buf += 1
+    endif
+  endfor
+  call assert_equal(1, count1, 'Xtest1 count')
+  call assert_equal(2, count2, 'Xtest2 count')
+  call assert_equal(2, count2buf, 'Xtest2 buffer count')
+
+  close
+  bwipe!
+  !cp Xtest_mks.out /tmp
+  call delete('Xtest_mks.out')
+endfunc
+
+
 
 " vim: shiftwidth=2 sts=2 expandtab
index 4078912749fb915fe43c49bfca63b79e0dc856b4..89d58e260e5b3ecef3f20207fb53abc95529c590 100644 (file)
@@ -769,6 +769,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1024,
 /**/
     1023,
 /**/