]> granicus.if.org Git - vim/commitdiff
updated for version 7.3.462 v7.3.462
authorBram Moolenaar <Bram@vim.org>
Wed, 29 Feb 2012 18:20:02 +0000 (19:20 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 29 Feb 2012 18:20:02 +0000 (19:20 +0100)
Problem:    When using ":loadview" folds may be closed unexpectedly.
Solution:   Take into account foldlevel. (Xavier de Gaye)

src/fold.c
src/version.c

index 4d294f13397e0e892ec4265742e7b632cc234a3e..881a1961422f8f7c3bca701cdc9e413e7075688f 100644 (file)
@@ -3292,7 +3292,8 @@ foldlevelSyntax(flp)
 /* put_folds() {{{2 */
 #if defined(FEAT_SESSION) || defined(PROTO)
 static int put_folds_recurse __ARGS((FILE *fd, garray_T *gap, linenr_T off));
-static int put_foldopen_recurse __ARGS((FILE *fd, garray_T *gap, linenr_T off));
+static int put_foldopen_recurse __ARGS((FILE *fd, win_T *wp, garray_T *gap, linenr_T off));
+static int put_fold_open_close __ARGS((FILE *fd, fold_T *fp, linenr_T off));
 
 /*
  * Write commands to "fd" to restore the manual folds in window "wp".
@@ -3312,7 +3313,7 @@ put_folds(fd, wp)
 
     /* If some folds are manually opened/closed, need to restore that. */
     if (wp->w_fold_manual)
-       return put_foldopen_recurse(fd, &wp->w_folds, (linenr_T)0);
+       return put_foldopen_recurse(fd, wp, &wp->w_folds, (linenr_T)0);
 
     return OK;
 }
@@ -3352,12 +3353,14 @@ put_folds_recurse(fd, gap, off)
  * Returns FAIL when writing failed.
  */
     static int
-put_foldopen_recurse(fd, gap, off)
+put_foldopen_recurse(fd, wp, gap, off)
     FILE       *fd;
+    win_T      *wp;
     garray_T   *gap;
     linenr_T   off;
 {
     int                i;
+    int                level;
     fold_T     *fp;
 
     fp = (fold_T *)gap->ga_data;
@@ -3367,27 +3370,60 @@ put_foldopen_recurse(fd, gap, off)
        {
            if (fp->fd_nested.ga_len > 0)
            {
-               /* open/close nested folds while this fold is open */
+               /* open nested folds while this fold is open */
                if (fprintf(fd, "%ld", fp->fd_top + off) < 0
                        || put_eol(fd) == FAIL
                        || put_line(fd, "normal zo") == FAIL)
                    return FAIL;
-               if (put_foldopen_recurse(fd, &fp->fd_nested, off + fp->fd_top)
+               if (put_foldopen_recurse(fd, wp, &fp->fd_nested,
+                                                            off + fp->fd_top)
                        == FAIL)
                    return FAIL;
+               /* close the parent when needed */
+               if (fp->fd_flags == FD_CLOSED)
+               {
+                   if (put_fold_open_close(fd, fp, off) == FAIL)
+                       return FAIL;
+               }
+           }
+           else
+           {
+               /* Open or close the leaf according to the window foldlevel.
+                * Do not close a leaf that is already closed, as it will close
+                * the parent. */
+               level = foldLevelWin(wp, off + fp->fd_top);
+               if ((fp->fd_flags == FD_CLOSED && wp->w_p_fdl >= level)
+                       || (fp->fd_flags != FD_CLOSED && wp->w_p_fdl < level))
+               if (put_fold_open_close(fd, fp, off) == FAIL)
+                   return FAIL;
            }
-           if (fprintf(fd, "%ld", fp->fd_top + off) < 0
-                   || put_eol(fd) == FAIL
-                   || fprintf(fd, "normal z%c",
-                                   fp->fd_flags == FD_CLOSED ? 'c' : 'o') < 0
-                   || put_eol(fd) == FAIL)
-               return FAIL;
        }
        ++fp;
     }
 
     return OK;
 }
+
+/* put_fold_open_close() {{{2 */
+/*
+ * Write the open or close command to "fd".
+ * Returns FAIL when writing failed.
+ */
+    static int
+put_fold_open_close(fd, fp, off)
+    FILE       *fd;
+    fold_T     *fp;
+    linenr_T   off;
+{
+    if (fprintf(fd, "%ld", fp->fd_top + off) < 0
+           || put_eol(fd) == FAIL
+           || fprintf(fd, "normal z%c",
+                          fp->fd_flags == FD_CLOSED ? 'c' : 'o') < 0
+           || put_eol(fd) == FAIL)
+       return FAIL;
+
+    return OK;
+}
 #endif /* FEAT_SESSION */
 
 /* }}}1 */
index e807a47b9c4427ed09fd084f26ebef2df691ec90..a1b588d91b082b310e7042ae7a5a924ccc3cb429 100644 (file)
@@ -714,6 +714,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    462,
 /**/
     461,
 /**/