summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2015-04-15 12:43:50 +0200
committerBram Moolenaar <Bram@vim.org>2015-04-15 12:43:50 +0200
commitd5f6933d5c57ea6f79bbdeab6c426cf66a393f33 (patch)
treea195ad8661e0cd1ae02670e2365ff77ea64894c6
parent05b20fb14ec3219d73014595cfb6cc28ae1e1fc3 (diff)
downloadvim-git-d5f6933d5c57ea6f79bbdeab6c426cf66a393f33.tar.gz
patch 7.4.700v7.4.700
Problem: Fold can't be opened after ":move". (Ein Brown) Solution: Delete the folding information and update it afterwards. (Christian Brabandt)
-rw-r--r--src/ex_cmds.c16
-rw-r--r--src/fold.c4
-rw-r--r--src/testdir/test45.in10
-rw-r--r--src/testdir/test45.ok5
-rw-r--r--src/version.c2
5 files changed, 35 insertions, 2 deletions
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 978d516f7..1abda7423 100644
--- 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;
}
diff --git a/src/fold.c b/src/fold.c
index 671bbf75a..21e455bb1 100644
--- 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;
diff --git a/src/testdir/test45.in b/src/testdir/test45.in
index e5af5073d..b1e8266ab 100644
--- 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
diff --git a/src/testdir/test45.ok b/src/testdir/test45.ok
index f04996e33..0f25e6218 100644
--- 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
diff --git a/src/version.c b/src/version.c
index 9d1eb7977..c03b9a4c5 100644
--- 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,