changeset 6755:b85fcd9b858d v7.4.700

patch 7.4.700 Problem: Fold can't be opened after ":move". (Ein Brown) Solution: Delete the folding information and update it afterwards. (Christian Brabandt)
author Bram Moolenaar <bram@vim.org>
date Wed, 15 Apr 2015 12:43:50 +0200
parents a0651f2537f5
children 18eb70de93ff
files src/ex_cmds.c src/fold.c src/testdir/test45.in src/testdir/test45.ok src/version.c
diffstat 5 files changed, 35 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -741,6 +741,16 @@ do_move(line1, line2, dest)
     linenr_T	extra;	    /* Num lines added before line1 */
     linenr_T	num_lines;  /* Num lines moved */
     linenr_T	last_line;  /* Last line in file after adding new text */
+#ifdef FEAT_FOLDING
+    int		isFolded;
+
+    /* Moving lines seems to corrupt the folds, delete folding info now
+     * and recreate it when finished.  Don't do this for manual folding, it
+     * would delete all folds. */
+    isFolded = hasAnyFolding(curwin) && !foldmethodIsManual(curwin);
+    if (isFolded)
+	deleteFoldRecurse(&curwin->w_folds);
+#endif
 
     if (dest >= line1 && dest < line2)
     {
@@ -839,6 +849,12 @@ do_move(line1, line2, dest)
     else
 	changed_lines(dest + 1, 0, line1 + num_lines, 0L);
 
+#ifdef FEAT_FOLDING
+	/* recreate folds */
+	if (isFolded)
+	    foldUpdateAll(curwin);
+#endif
+
     return OK;
 }
 
--- a/src/fold.c
+++ b/src/fold.c
@@ -847,8 +847,8 @@ foldUpdate(wp, top, bot)
     fold_T	*fp;
 
     /* Mark all folds from top to bot as maybe-small. */
-    (void)foldFind(&curwin->w_folds, top, &fp);
-    while (fp < (fold_T *)curwin->w_folds.ga_data + curwin->w_folds.ga_len
+    (void)foldFind(&wp->w_folds, top, &fp);
+    while (fp < (fold_T *)wp->w_folds.ga_data + wp->w_folds.ga_len
 	    && fp->fd_top < bot)
     {
 	fp->fd_small = MAYBE;
--- a/src/testdir/test45.in
+++ b/src/testdir/test45.in
@@ -63,6 +63,16 @@ endfun
 :call append("$", foldlevel("."))
 :/^last/+1,$w! test.out
 :delfun Flvl
+:new
+iTest fdm=indent and :move bug END
+line2
+	Test fdm=indent START
+	line3
+	line4
+:set fdm=indent
+:1m1
+2jzc:m0
+:%w >> test.out
 :qa!
 ENDTEST
 
--- a/src/testdir/test45.ok
+++ b/src/testdir/test45.ok
@@ -16,3 +16,8 @@ expr 2
 1
 2
 0
+	Test fdm=indent START
+	line3
+	line4
+Test fdm=indent and :move bug END
+line2
--- a/src/version.c
+++ b/src/version.c
@@ -742,6 +742,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    700,
+/**/
     699,
 /**/
     698,