# HG changeset patch # User Bram Moolenaar # Date 1429094630 -7200 # Node ID b85fcd9b858d1f9b5dd04f652d692fa1afeb841d # Parent a0651f2537f5bbf9babb0c07d3446d52bf349c62 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) diff --git a/src/ex_cmds.c b/src/ex_cmds.c --- 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 --- 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 --- 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 --- 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 --- 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,