Hi Bram and list,
I made a patch about :tab modifier counter.
Existing features:
:tab split " opens current buffer in new tab page
:tab help gt" opens tab page with help for "gt"
:0tab help " opens tab page with help before the first one
New features:
:.tab help gt " same as `:tab help gt`
:+tab help " opens tab page with help after the next tab page
:-tab help " opens tab page with help before the current one
:$tab help " opens tab page with help after the last one
Note:
If [counter] specified by absolute or relative values, It will perform the
range check.
When it does out of range(0 ~ number of tabpages), error(E16) occurs.
Check it and include please.
--
Best regards,
Hirohito Higashi (a.k.a. h_east)
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
diff --git a/runtime/doc/tabpage.txt b/runtime/doc/tabpage.txt
index b98c18b..f2444c0 100644
--- a/runtime/doc/tabpage.txt
+++ b/runtime/doc/tabpage.txt
@@ -87,14 +87,21 @@ In the GUI tab pages line you can use the right mouse button to open menu.
Execute {cmd} and when it opens a new window open a new tab
page instead. Doesn't work for |:diffsplit|, |:diffpatch|,
|:execute| and |:normal|.
- When [count] is omitted the tab page appears after the current
- one.
- When [count] is specified the new tab page comes after tab
- page [count]. Use ":0tab cmd" to get the new tab page as the
- first one.
+ If [count] is given the new tab page appears after the tab
+ page [count] otherwise the new tab page will appear after the
+ current one.
Examples: >
- :tab split " opens current buffer in new tab page
- :tab help gt " opens tab page with help for "gt"
+ :tab split " opens current buffer in new tab page
+ :tab help gt" opens tab page with help for "gt"
+ :.tab help gt " as above
+ :+tab help " opens tab page with help after the next
+" tab page
+ :-tab help " opens tab page with help before the
+" current one
+ :0tab help " opens tab page with help before the
+" first one
+ :$tab help " opens tab page with help after the last
+" one
CTRL-W gf Open a new tab page and edit the file name under the cursor.
See |CTRL-W_gf|.
@@ -141,10 +148,11 @@ something else.
given, then they become hidden. But modified buffers are
never abandoned, so changes cannot get lost. >
:tabonly " close all tab pages except the current
+" one
:{count}tabo[nly][!]
Close all tab pages except the {count}th one. >
- :.tabonly " one
+ :.tabonly " as above
:-tabonly " close all tab pages except the previous
" one
:+tabonly " close all tab pages except the next one
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 1a7fbfa..9f1d227 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -1858,9 +1858,7 @@ do_one_cmd(
/*
* 2. Handle command modifiers.
*/
- p = ea.cmd;
- if (VIM_ISDIGIT(*ea.cmd))
- p = skipwhite(skipdigits(ea.cmd));
+ p = skip_range(ea.cmd, NULL);
switch (*p)
{
/* When adding an entry, also modify cmd_exists(). */
@@ -1992,10 +1990,19 @@ do_one_cmd(
case 't': if (checkforcmd(&p, "tab", 3))
{
#ifdef FEAT_WINDOWS
- if (vim_isdigit(*ea.cmd))
-cmdmod.tab = atoi((char *)ea.cmd) + 1;
- else
+ long tabnr = get_address(&ea, &ea.cmd, ADDR_TABS,
+ea.skip, FALSE);
+ if (tabnr == MAXLNUM)
cmdmod.tab = tabpage_index(curtab) + 1;
+ else
+ {
+if (tabnr < 0 || tabnr > LAST_TAB_NR)
+{
+errormsg = (char_u *)_(e_invrange);
+goto doend;
+}
+cmdmod.tab = tabnr + 1;
+ }
ea.cmd = p;
#endif
continue;
diff --git a/src/testdir/test_tabpage.vim b/src/testdir/test_tabpage.vim
index e6b85d6..f1c41e9 100644
--- a/src/testdir/test_tabpage.vim
+++ b/src/testdir/test_tabpage.vim
@@ -186,4 +186,36 @@ function Test_tabpage_with_autocmd()
bw!
endfunction
+function Test_tabpage_with_tab_modifier()
+ for n in range(4)
+tabedit
+ endfor
+
+ function s:check_tab(pre_nr, cmd, post_nr)
+exec 'tabnext ' . a:pre_nr
+exec a:cmd
+call assert_equal(a:post_nr, tabpagenr())
+call assert_equal('help', &filetype)
+helpclose
+ endfunc
+
+ call s:check_tab(1, 'tab help', 2)
+ call s:check_tab(1, '3tab help', 4)
+ call s:check_tab(1, '.tab help', 2)
+ call s:check_tab(1, '.+1tab help', 3)
+ call s:check_tab(1, '0tab help', 1)
+ call s:check_tab(2, '+tab help', 4)
+ call s:check_tab(2, '