Merge pull request #4175 from watiko/vim-7.4.700

vim-patch:7.4.700
This commit is contained in:
Justin M. Keyes
2016-02-07 01:33:01 -05:00
7 changed files with 162 additions and 107 deletions

View File

@@ -690,9 +690,17 @@ int do_move(linenr_T line1, linenr_T line2, linenr_T dest)
{ {
char_u *str; char_u *str;
linenr_T l; linenr_T l;
linenr_T extra; /* Num lines added before line1 */ linenr_T extra; // Num lines added before line1
linenr_T num_lines; /* Num lines moved */ linenr_T num_lines; // Num lines moved
linenr_T last_line; /* Last line in file after adding new text */ linenr_T last_line; // Last line in file after adding new text
// 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.
bool isFolded = hasAnyFolding(curwin) && !foldmethodIsManual(curwin);
if (isFolded) {
deleteFoldRecurse(&curwin->w_folds);
}
if (dest >= line1 && dest < line2) { if (dest >= line1 && dest < line2) {
EMSG(_("E134: Move lines into themselves")); EMSG(_("E134: Move lines into themselves"));
@@ -777,8 +785,14 @@ int do_move(linenr_T line1, linenr_T line2, linenr_T dest)
if (dest > last_line + 1) if (dest > last_line + 1)
dest = last_line + 1; dest = last_line + 1;
changed_lines(line1, 0, dest, 0L); changed_lines(line1, 0, dest, 0L);
} else } else {
changed_lines(dest + 1, 0, line1 + num_lines, 0L); changed_lines(dest + 1, 0, line1 + num_lines, 0L);
}
// recreate folds
if (isFolded) {
foldUpdateAll(curwin);
}
return OK; return OK;
} }

View File

@@ -767,9 +767,9 @@ void foldUpdate(win_T *wp, linenr_T top, linenr_T bot)
return; return;
} }
/* Mark all folds from top to bot as maybe-small. */ // Mark all folds from top to bot as maybe-small.
(void)foldFind(&curwin->w_folds, top, &fp); (void)foldFind(&wp->w_folds, top, &fp);
while (fp < (fold_T *)curwin->w_folds.ga_data + curwin->w_folds.ga_len while (fp < (fold_T *)wp->w_folds.ga_data + wp->w_folds.ga_len
&& fp->fd_top < bot) { && fp->fd_top < bot) {
fp->fd_small = MAYBE; fp->fd_small = MAYBE;
++fp; ++fp;

View File

@@ -15,7 +15,7 @@ SCRIPTS := \
test30.out \ test30.out \
test32.out test34.out \ test32.out test34.out \
test36.out test37.out test40.out \ test36.out test37.out test40.out \
test42.out test45.out \ test42.out \
test47.out test48.out test49.out \ test47.out test48.out test49.out \
test52.out test53.out test55.out \ test52.out test53.out test55.out \
test64.out \ test64.out \

View File

@@ -1,80 +0,0 @@
Tests for folding. vim: set ft=vim :
STARTTEST
:so small.vim
:" We also need the +syntax feature here.
:if !has("syntax")
e! test.ok
w! test.out
qa!
:endif
:" basic test if a fold can be created, opened, moving to the end and closed
/^1
zf2j:call append("$", "manual " . getline(foldclosed(".")))
zo:call append("$", foldclosed("."))
]z:call append("$", getline("."))
zc:call append("$", getline(foldclosed(".")))
:" test folding with markers.
:set fdm=marker fdl=1 fdc=3
/^5
:call append("$", "marker " . foldlevel("."))
[z:call append("$", foldlevel("."))
jo{{ r{jj:call append("$", foldlevel("."))
kYpj:call append("$", foldlevel("."))
:" test folding with indent
:set fdm=indent sw=2
/^2 b
i jI :call append("$", "indent " . foldlevel("."))
k:call append("$", foldlevel("."))
:" test syntax folding
:set fdm=syntax fdl=0
:syn region Hup start="dd" end="ii" fold contains=Fd1,Fd2,Fd3
:syn region Fd1 start="ee" end="ff" fold contained
:syn region Fd2 start="gg" end="hh" fold contained
:syn region Fd3 start="commentstart" end="commentend" fold contained
Gzk:call append("$", "folding " . getline("."))
k:call append("$", getline("."))
jAcommentstart Acommentend:set fdl=1
3j:call append("$", getline("."))
:set fdl=0
zO j:call append("$", getline("."))
:" test expression folding
:fun Flvl()
let l = getline(v:lnum)
if l =~ "bb$"
return 2
elseif l =~ "gg$"
return "s1"
elseif l =~ "ii$"
return ">2"
elseif l =~ "kk$"
return "0"
endif
return "="
endfun
:set fdm=expr fde=Flvl()
/bb$
:call append("$", "expr " . foldlevel("."))
/hh$
:call append("$", foldlevel("."))
/ii$
:call append("$", foldlevel("."))
/kk$
:call append("$", foldlevel("."))
:/^last/+1,$w! test.out
:delfun Flvl
:qa!
ENDTEST
1 aa
2 bb
3 cc
4 dd {{{
5 ee {{{ }}}
6 ff }}}
7 gg
8 hh
9 ii
a jj
b kk
last

View File

@@ -1,18 +0,0 @@
manual 1 aa
-1
3 cc
1 aa
marker 2
1
1
0
indent 2
1
folding 9 ii
3 cc
7 gg
8 hh
expr 2
1
2
0

View File

@@ -588,7 +588,7 @@ static int included_patches[] = {
// 703 NA // 703 NA
702, 702,
// 701 NA // 701 NA
// 700, 700,
699, 699,
698, 698,
697, 697,

View File

@@ -0,0 +1,139 @@
-- Tests for folding.
local helpers = require('test.functional.helpers')
local feed, insert, clear, execute, expect =
helpers.feed, helpers.insert, helpers.clear, helpers.execute, helpers.expect
describe('folding', function()
before_each(clear)
it('is working', function()
insert([[
1 aa
2 bb
3 cc
4 dd {{{
5 ee {{{ }}}
6 ff }}}
7 gg
8 hh
9 ii
a jj
b kk
last]])
-- Basic test if a fold can be created, opened, moving to the end and
-- closed.
execute('/^1')
feed('zf2j')
execute('call append("$", "manual " . getline(foldclosed(".")))')
feed('zo')
execute('call append("$", foldclosed("."))')
feed(']z')
execute('call append("$", getline("."))')
feed('zc')
execute('call append("$", getline(foldclosed(".")))')
-- Test folding with markers.
execute('set fdm=marker fdl=1 fdc=3')
execute('/^5')
execute('call append("$", "marker " . foldlevel("."))')
feed('[z')
execute('call append("$", foldlevel("."))')
feed('jo{{ <esc>r{jj')
execute('call append("$", foldlevel("."))')
feed('kYpj')
execute('call append("$", foldlevel("."))')
-- Test folding with indent.
execute('set fdm=indent sw=2')
execute('/^2 b')
feed('i <esc>jI <esc>')
execute('call append("$", "indent " . foldlevel("."))')
feed('k')
execute('call append("$", foldlevel("."))')
-- Test syntax folding.
execute('set fdm=syntax fdl=0')
execute('syn region Hup start="dd" end="ii" fold contains=Fd1,Fd2,Fd3')
execute('syn region Fd1 start="ee" end="ff" fold contained')
execute('syn region Fd2 start="gg" end="hh" fold contained')
execute('syn region Fd3 start="commentstart" end="commentend" fold contained')
feed('Gzk')
execute('call append("$", "folding " . getline("."))')
feed('k')
execute('call append("$", getline("."))')
feed('jAcommentstart <esc>Acommentend<esc>')
execute('set fdl=1')
feed('3j')
execute('call append("$", getline("."))')
execute('set fdl=0')
feed('zO<C-L>j')
execute('call append("$", getline("."))')
-- Test expression folding.
execute('fun Flvl()')
execute(' let l = getline(v:lnum)')
execute(' if l =~ "bb$"')
execute(' return 2')
execute(' elseif l =~ "gg$"')
execute(' return "s1"')
execute(' elseif l =~ "ii$"')
execute(' return ">2"')
execute(' elseif l =~ "kk$"')
execute(' return "0"')
execute(' endif')
execute(' return "="')
execute('endfun')
execute('set fdm=expr fde=Flvl()')
execute('/bb$')
execute('call append("$", "expr " . foldlevel("."))')
execute('/hh$')
execute('call append("$", foldlevel("."))')
execute('/ii$')
execute('call append("$", foldlevel("."))')
execute('/kk$')
execute('call append("$", foldlevel("."))')
execute('0,/^last/delete')
execute('delfun Flvl')
-- Assert buffer contents.
expect([[
manual 1 aa
-1
3 cc
1 aa
marker 2
1
1
0
indent 2
1
folding 9 ii
3 cc
7 gg
8 hh
expr 2
1
2
0]])
end)
it('can open after :move', function()
insert([[
Test fdm=indent and :move bug END
line2
Test fdm=indent START
line3
line4]])
execute('set noai nosta')
execute('set fdm=indent')
execute('1m1')
feed('2jzc')
execute('m0')
expect([[
Test fdm=indent START
line3
line4
Test fdm=indent and :move bug END
line2]])
end)
end)