summaryrefslogtreecommitdiffstats
path: root/src/ex_docmd.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2015-04-21 18:08:39 +0200
committerBram Moolenaar <Bram@vim.org>2015-04-21 18:08:39 +0200
commit40ce3a4e1f50badb75ca812e26557a9bc5fde8c6 (patch)
tree76b61256322ed7d01bbd3913ec3ae45f9d826b5a /src/ex_docmd.c
parent77354e78a887e1b59ac519c5a1cb0e7fe9fc5899 (diff)
patch 7.4.709v7.4.709
Problem: ":tabmove" does not work as documented. Solution: Make it work consistently. Update documentation and add tests. (Hirohito Higashi)
Diffstat (limited to 'src/ex_docmd.c')
-rw-r--r--src/ex_docmd.c37
1 files changed, 28 insertions, 9 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index e46ea05c1d..af63b6c410 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -8145,7 +8145,7 @@ ex_tabnext(eap)
ex_tabmove(eap)
exarg_T *eap;
{
- int tab_number = 9999;
+ int tab_number;
if (eap->arg && *eap->arg != NUL)
{
@@ -8166,19 +8166,38 @@ ex_tabmove(eap)
else
p = eap->arg;
- if (p == skipdigits(p))
+ if (relative == 0)
{
- /* No numbers as argument. */
- eap->errmsg = e_invarg;
- return;
+ if (STRCMP(p, "$") == 0)
+ tab_number = LAST_TAB_NR;
+ else if (p == skipdigits(p))
+ {
+ /* No numbers as argument. */
+ eap->errmsg = e_invarg;
+ return;
+ }
+ else
+ tab_number = getdigits(&p);
+ }
+ else
+ {
+ if (*p != NUL)
+ tab_number = getdigits(&p);
+ else
+ tab_number = 1;
+ tab_number = tab_number * relative + tabpage_index(curtab);
+ if (relative == -1)
+ --tab_number;
}
-
- 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;
+ if (**eap->cmdlinep == '-')
+ --tab_number;
+ }
+ else
+ tab_number = LAST_TAB_NR;
tabpage_move(tab_number);
}