Permalink
Browse files

patch 8.0.0581: moving folded text is sometimes not correct

Problem:    Moving folded text is sometimes not correct.
Solution:   Bail out when "move_end" is zero. (Matthew Malcomson)
  • Loading branch information...
brammool committed Apr 22, 2017
1 parent f1d21c8 commit 94be619e30e82d28cadeea5e0766c6f5c321ff8b
Showing with 61 additions and 22 deletions.
  1. +7 −3 src/fold.c
  2. +52 −19 src/testdir/test_fold.vim
  3. +2 −0 src/version.c
View
@@ -3133,10 +3133,14 @@ foldMoveRange(garray_T *gap, linenr_T line1, linenr_T line2, linenr_T dest)
dest_index = fold_index(fp, gap);
/*
* All folds are now correct, but they are not necessarily in the correct
* order. We have to swap folds in the range [move_end, dest_index) with
* those in the range [move_start, move_end).
* All folds are now correct, but not necessarily in the correct order. We
* must swap folds in the range [move_end, dest_index) with those in the
* range [move_start, move_end).
*/
if (move_end == 0)
/* There are no folds after those moved, hence no folds have been moved
* out of order. */
return;
foldReverseOrder(gap, (linenr_T)move_start, (linenr_T)dest_index - 1);
foldReverseOrder(gap, (linenr_T)move_start,
(linenr_T)(move_start + dest_index - move_end - 1));
View
@@ -1,10 +1,10 @@
" Test for folding
func! PrepIndent(arg)
func PrepIndent(arg)
return [a:arg] + repeat(["\t".a:arg], 5)
endfu
func! Test_address_fold()
func Test_address_fold()
new
call setline(1, ['int FuncName() {/*{{{*/', 1, 2, 3, 4, 5, '}/*}}}*/',
\ 'after fold 1', 'after fold 2', 'after fold 3'])
@@ -68,17 +68,7 @@ func! Test_address_fold()
quit!
endfunc
func! Test_indent_fold()
new
call setline(1, ['', 'a', ' b', ' c'])
setl fen fdm=indent
2
norm! >>
let a=map(range(1,4), 'foldclosed(v:val)')
call assert_equal([-1,-1,-1,-1], a)
endfunc
func! Test_indent_fold()
func Test_indent_fold()
new
call setline(1, ['', 'a', ' b', ' c'])
setl fen fdm=indent
@@ -89,7 +79,7 @@ func! Test_indent_fold()
bw!
endfunc
func! Test_indent_fold2()
func Test_indent_fold2()
new
call setline(1, ['', '{{{', '}}}', '{{{', '}}}'])
setl fen fdm=marker
@@ -122,7 +112,7 @@ func Test_manual_fold_with_filter()
endfor
endfunc
func! Test_indent_fold_with_read()
func Test_indent_fold_with_read()
new
set foldmethod=indent
call setline(1, repeat(["\<Tab>a"], 4))
@@ -224,7 +214,11 @@ func Test_update_folds_expr_read()
set foldmethod& foldexpr&
endfunc
func! Test_move_folds_around_manual()
func Check_foldlevels(expected)
call assert_equal(a:expected, map(range(1, line('$')), 'foldlevel(v:val)'))
endfunc
func Test_move_folds_around_manual()
new
let input = PrepIndent("a") + PrepIndent("b") + PrepIndent("c")
call setline(1, PrepIndent("a") + PrepIndent("b") + PrepIndent("c"))
@@ -293,11 +287,50 @@ func! Test_move_folds_around_manual()
6m$
" The first fold has been truncated to the 5'th line.
" Second fold has been moved up because the moved line is now below it.
call assert_equal([0, 1, 1, 1, 1, 0, 0, 0, 1, 0], map(range(1, line('$')), 'foldlevel(v:val)'))
call Check_foldlevels([0, 1, 1, 1, 1, 0, 0, 0, 1, 0])
%delete
set fdm=indent foldlevel=0
call setline(1, [
\ "a",
\ "\ta",
\ "\t\ta",
\ "\t\ta",
\ "\t\ta",
\ "a",
\ "a"])
set fdm=manual
%foldopen!
4,5m6
call Check_foldlevels([0, 1, 2, 0, 0, 0, 0])
%delete
set fdm=indent
call setline(1, [
\ "\ta",
\ "\t\ta",
\ "\t\ta",
\ "\t\ta",
\ "\ta",
\ "\t\ta",
\ "\t\ta",
\ "\t\ta",
\ "\ta",
\ "\t\ta",
\ "\t\ta",
\ "\t\ta",
\ "\t\ta",
\ "\ta",
\ "a"])
set fdm=manual
%foldopen!
13m7
call Check_foldlevels([1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 2, 2, 1, 0])
bw!
endfunc
func! Test_move_folds_around_indent()
func Test_move_folds_around_indent()
new
let input = PrepIndent("a") + PrepIndent("b") + PrepIndent("c")
call setline(1, PrepIndent("a") + PrepIndent("b") + PrepIndent("c"))
@@ -357,7 +390,7 @@ func! Test_move_folds_around_indent()
6m$
" The first fold has been truncated to the 5'th line.
" Second fold has been moved up because the moved line is now below it.
call assert_equal([0, 1, 1, 1, 1, 0, 0, 0, 1, 1], map(range(1, line('$')), 'foldlevel(v:val)'))
call Check_foldlevels([0, 1, 1, 1, 1, 0, 0, 0, 1, 1])
bw!
endfunc
View
@@ -764,6 +764,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
581,
/**/
580,
/**/

0 comments on commit 94be619

Please sign in to comment.