Mercurial > vim
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