summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-01-02 14:27:34 +0100
committerBram Moolenaar <Bram@vim.org>2017-01-02 14:27:34 +0100
commitded2782783f352201ac0b05c6dbe4831adb4a58b (patch)
tree070f8f840fbb4d2558d3d9853dfdfd8b94551e00
parentc4bfedabe057c05f09a455a5851089e177fa9c00 (diff)
patch 8.0.0135v8.0.0135
Problem: An address relative to the current line, ":.,+3y", does not work properly on a closed fold. (Efraim Yawitz) Solution: Correct for including the closed fold. (Christian Brabandt)
-rw-r--r--src/Makefile1
-rw-r--r--src/ex_docmd.c28
-rw-r--r--src/testdir/Make_all.mak1
-rw-r--r--src/testdir/test_fold.vim65
-rw-r--r--src/version.c2
5 files changed, 89 insertions, 8 deletions
diff --git a/src/Makefile b/src/Makefile
index d6a5ba439b..4b29ae118f 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -2106,6 +2106,7 @@ test_arglist \
test_filter_map \
test_fnameescape \
test_fnamemodify \
+ test_fold \
test_glob2regpat \
test_gf \
test_gn \
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 2b0f15ee9d..1af60abd28 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -137,7 +137,7 @@ static int getargopt(exarg_T *eap);
#endif
static int check_more(int, int);
-static linenr_T get_address(exarg_T *, char_u **, int addr_type, int skip, int to_other_file);
+static linenr_T get_address(exarg_T *, char_u **, int addr_type, int skip, int to_other_file, int address_count);
static void get_flags(exarg_T *eap);
#if !defined(FEAT_PERL) \
|| !defined(FEAT_PYTHON) || !defined(FEAT_PYTHON3) \
@@ -1791,6 +1791,7 @@ do_one_cmd(
cmdmod_T save_cmdmod;
int ni; /* set when Not Implemented */
char_u *cmd;
+ int address_count = 1;
vim_memset(&ea, 0, sizeof(ea));
ea.line1 = 1;
@@ -2015,7 +2016,7 @@ do_one_cmd(
{
#ifdef FEAT_WINDOWS
long tabnr = get_address(&ea, &ea.cmd, ADDR_TABS,
- ea.skip, FALSE);
+ ea.skip, FALSE, 1);
if (tabnr == MAXLNUM)
cmdmod.tab = tabpage_index(curtab) + 1;
else
@@ -2175,7 +2176,7 @@ do_one_cmd(
}
ea.cmd = skipwhite(ea.cmd);
lnum = get_address(&ea, &ea.cmd, ea.addr_type, ea.skip,
- ea.addr_count == 0);
+ ea.addr_count == 0, address_count++);
if (ea.cmd == NULL) /* error detected */
goto doend;
if (lnum == MAXLNUM)
@@ -4363,7 +4364,8 @@ get_address(
char_u **ptr,
int addr_type, /* flag: one of ADDR_LINES, ... */
int skip, /* only skip the address, don't use it */
- int to_other_file) /* flag: may jump to other file */
+ int to_other_file, /* flag: may jump to other file */
+ int address_count) /* 1 for first address, >1 after comma */
{
int c;
int i;
@@ -4639,10 +4641,20 @@ get_address(
|| addr_type == ADDR_BUFFERS)
lnum = compute_buffer_local_count(
addr_type, lnum, (i == '-') ? -1 * n : n);
- else if (i == '-')
- lnum -= n;
else
- lnum += n;
+ {
+#ifdef FEAT_FOLDING
+ /* Relative line addressing, need to adjust for folded lines
+ * now, but only do it after the first address. */
+ if (addr_type == ADDR_LINES && (i == '-' || i == '+')
+ && address_count >= 2)
+ (void)hasFolding(lnum, NULL, &lnum);
+#endif
+ if (i == '-')
+ lnum -= n;
+ else
+ lnum += n;
+ }
}
} while (*cmd == '/' || *cmd == '?');
@@ -9301,7 +9313,7 @@ ex_copymove(exarg_T *eap)
{
long n;
- n = get_address(eap, &eap->arg, eap->addr_type, FALSE, FALSE);
+ n = get_address(eap, &eap->arg, eap->addr_type, FALSE, FALSE, 1);
if (eap->arg == NULL) /* error detected */
{
eap->nextcmd = NULL;
diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak
index c78e34bd8a..072c61c796 100644
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -151,6 +151,7 @@ NEW_TESTS = test_arglist.res \
test_display.res \
test_farsi.res \
test_fnameescape.res \
+ test_fold.res \
test_gf.res \
test_gn.res \
test_gui.res \
diff --git a/src/testdir/test_fold.vim b/src/testdir/test_fold.vim
new file mode 100644
index 0000000000..1b52e92a02
--- /dev/null
+++ b/src/testdir/test_fold.vim
@@ -0,0 +1,65 @@
+" Test for folding
+
+function! Test_address_fold()
+ new
+ call setline(1, ['int FuncName() {/*{{{*/', 1, 2, 3, 4, 5, '}/*}}}*/',
+ \ 'after fold 1', 'after fold 2', 'after fold 3'])
+ setl fen fdm=marker
+ " The next ccommands should all copy the same part of the buffer,
+ " regardless of the adressing type, since the part to be copied
+ " is folded away
+ :1y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
+ :.y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
+ :.+y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
+ :.,.y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
+ :sil .1,.y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
+ " use silent to make E493 go away
+ :sil .+,.y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
+ :,y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
+ :,+y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/','after fold 1'], getreg(0,1,1))
+ " using .+3 as second address should copy the whole folded line + the next 3
+ " lines
+ :.,+3y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/',
+ \ 'after fold 1', 'after fold 2', 'after fold 3'], getreg(0,1,1))
+ :sil .,-2y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
+
+ " now test again with folding disabled
+ set nofoldenable
+ :1y
+ call assert_equal(['int FuncName() {/*{{{*/'], getreg(0,1,1))
+ :.y
+ call assert_equal(['int FuncName() {/*{{{*/'], getreg(0,1,1))
+ :.+y
+ call assert_equal(['1'], getreg(0,1,1))
+ :.,.y
+ call assert_equal(['int FuncName() {/*{{{*/'], getreg(0,1,1))
+ " use silent to make E493 go away
+ :sil .1,.y
+ call assert_equal(['int FuncName() {/*{{{*/', '1'], getreg(0,1,1))
+ " use silent to make E493 go away
+ :sil .+,.y
+ call assert_equal(['int FuncName() {/*{{{*/', '1'], getreg(0,1,1))
+ :,y
+ call assert_equal(['int FuncName() {/*{{{*/'], getreg(0,1,1))
+ :,+y
+ call assert_equal(['int FuncName() {/*{{{*/', '1'], getreg(0,1,1))
+ " using .+3 as second address should copy the whole folded line + the next 3
+ " lines
+ :.,+3y
+ call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3'], getreg(0,1,1))
+ :7
+ :sil .,-2y
+ call assert_equal(['4', '5', '}/*}}}*/'], getreg(0,1,1))
+
+ quit!
+endfunction
diff --git a/src/version.c b/src/version.c
index 723544ff42..b3f7c9732e 100644
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 135,
+/**/
134,
/**/
133,