summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/tabpage.txt10
-rw-r--r--src/ex_cmds.h2
-rw-r--r--src/ex_docmd.c37
-rw-r--r--src/testdir/test62.in28
-rw-r--r--src/testdir/test62.ok10
-rw-r--r--src/version.c2
-rw-r--r--src/window.c2
7 files changed, 88 insertions, 3 deletions
diff --git a/runtime/doc/tabpage.txt b/runtime/doc/tabpage.txt
index a30d3a179..a2da5b307 100644
--- a/runtime/doc/tabpage.txt
+++ b/runtime/doc/tabpage.txt
@@ -173,10 +173,20 @@ Other commands:
REORDERING TAB PAGES:
:tabm[ove] [N] *:tabm* *:tabmove*
+:[N]tabm[ove]
Move the current tab page to after tab page N. Use zero to
make the current tab page the first one. Without N the tab
page is made the last one.
+:tabm[ove] +[N]
+:tabm[ove] -[N]
+ Move the current tab page N places to the right (with +) or to
+ the left (with -).
+
+Note that although it is possible to move a tab behind the N-th one by using
+:Ntabmove, it is impossible to move it by N places by using :+Ntabmove. For
+clarification what +N means in this context see |[range]|.
+
LOOPING OVER TAB PAGES:
diff --git a/src/ex_cmds.h b/src/ex_cmds.h
index ac61f1a0a..cfe150225 100644
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -944,7 +944,7 @@ EX(CMD_tabfind, "tabfind", ex_splitview,
EX(CMD_tabfirst, "tabfirst", ex_tabnext,
TRLBAR),
EX(CMD_tabmove, "tabmove", ex_tabmove,
- RANGE|NOTADR|ZEROR|COUNT|TRLBAR|ZEROR),
+ RANGE|NOTADR|ZEROR|EXTRA|NOSPC|TRLBAR),
EX(CMD_tablast, "tablast", ex_tabnext,
TRLBAR),
EX(CMD_tabnext, "tabnext", ex_tabnext,
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 6740a51da..cc80c14b7 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -7478,7 +7478,42 @@ ex_tabnext(eap)
ex_tabmove(eap)
exarg_T *eap;
{
- tabpage_move(eap->addr_count == 0 ? 9999 : (int)eap->line2);
+ int tab_number = 9999;
+
+ if (eap->arg && *eap->arg != NUL)
+ {
+ char_u *p = eap->arg;
+ int relative = 0; /* argument +N/-N means: move N places to the
+ * right/left relative to the current position. */
+
+ if (*eap->arg == '-')
+ {
+ relative = -1;
+ p = eap->arg + 1;
+ }
+ else if (*eap->arg == '+')
+ {
+ relative = 1;
+ p = eap->arg + 1;
+ }
+ else
+ p = eap->arg;
+
+ if (p == skipdigits(p))
+ {
+ /* No numbers as argument. */
+ eap->errmsg = e_invarg;
+ return;
+ }
+
+ tab_number = getdigits(&p);
+ if (relative != 0)
+ tab_number = tab_number * relative + tabpage_index(curtab) - 1;;
+ }
+ else if (eap->addr_count != 0)
+ tab_number = eap->line2;
+
+ tabpage_move(tab_number);
}
/*
diff --git a/src/testdir/test62.in b/src/testdir/test62.in
index 1e514cd21..fd1844bdc 100644
--- a/src/testdir/test62.in
+++ b/src/testdir/test62.in
@@ -93,6 +93,34 @@ STARTTEST
:endif
:"
:"
+:for i in range(9) | tabnew | endfor
+1gt
+Go=tabpagenr() 
+:tabmove 5
+i=tabpagenr() 
+:tabmove -2
+i=tabpagenr() 
+:tabmove +4
+i=tabpagenr() 
+:tabmove
+i=tabpagenr() 
+:tabmove -20
+i=tabpagenr() 
+:tabmove +20
+i=tabpagenr() 
+:3tabmove
+i=tabpagenr() 
+:7tabmove 5
+i=tabpagenr() 
+:let a='No error caught.'
+:try
+:tabmove foo
+:catch E474
+:let a='E474 caught.'
+:endtry
+i=a 
+:"
+:"
:/^Results/,$w! test.out
:qa!
ENDTEST
diff --git a/src/testdir/test62.ok b/src/testdir/test62.ok
index 7625cd2e2..0ac1fcbbd 100644
--- a/src/testdir/test62.ok
+++ b/src/testdir/test62.ok
@@ -8,3 +8,13 @@ settabvar: pass
tab drop 1: pass
tab drop 2: pass
tab drop 3: pass
+1
+6
+4
+8
+10
+1
+10
+4
+6
+E474 caught.
diff --git a/src/version.c b/src/version.c
index 637abb7df..4bfec7865 100644
--- a/src/version.c
+++ b/src/version.c
@@ -715,6 +715,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 591,
+/**/
590,
/**/
589,
diff --git a/src/window.c b/src/window.c
index c65f49d79..6460684bc 100644
--- a/src/window.c
+++ b/src/window.c
@@ -3929,7 +3929,7 @@ tabpage_move(nr)
}
/* Re-insert it at the specified position. */
- if (n == 0)
+ if (n <= 0)
{
curtab->tp_next = first_tabpage;
first_tabpage = curtab;