From: Bram Moolenaar Date: Wed, 15 Apr 2015 10:43:50 +0000 (+0200) Subject: patch 7.4.700 X-Git-Tag: v7.4.700 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d5f6933d5c57ea6f79bbdeab6c426cf66a393f33;p=vim 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 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 @@ -741,6 +741,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 700, /**/ 699, /**/