changeset 9927:e1a8b2601fe0 v7.4.2237

commit https://github.com/vim/vim/commit/9b7f8ce9eb3cb704f8cc14ab659bf86b1d6dc13c Author: Bram Moolenaar <Bram@vim.org> Date: Sun Aug 21 19:07:17 2016 +0200 patch 7.4.2237 Problem: Can't use "." and "$" with ":tab". Solution: Support a range for ":tab". (Hirohito Higashi)
author Christian Brabandt <cb@256bit.org>
date Sun, 21 Aug 2016 19:15:05 +0200
parents 4a5f95edebca
children 16a7dee7239c
files runtime/doc/tabpage.txt src/ex_docmd.c src/testdir/test_tabpage.vim src/version.c
diffstat 4 files changed, 63 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/tabpage.txt
+++ b/runtime/doc/tabpage.txt
@@ -87,14 +87,21 @@ In the GUI tab pages line you can use th
 		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
--- 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;
+			    long tabnr = get_address(&ea, &ea.cmd, ADDR_TABS,
+								ea.skip, FALSE);
+			    if (tabnr == MAXLNUM)
+				cmdmod.tab = tabpage_index(curtab) + 1;
 			    else
-				cmdmod.tab = tabpage_index(curtab) + 1;
+			    {
+				if (tabnr < 0 || tabnr > LAST_TAB_NR)
+				{
+				    errormsg = (char_u *)_(e_invrange);
+				    goto doend;
+				}
+				cmdmod.tab = tabnr + 1;
+			    }
 			    ea.cmd = p;
 #endif
 			    continue;
--- 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, '+2tab help', 5)
+  call s:check_tab(4, '-tab help', 4)
+  call s:check_tab(4, '-2tab help', 3)
+  call s:check_tab(3, '$tab help', 6)
+  call assert_fails('99tab help', 'E16:')
+  call assert_fails('+99tab help', 'E16:')
+  call assert_fails('-99tab help', 'E16:')
+
+  delfunction s:check_tab
+  tabonly!
+  bw!
+endfunction
+
 " vim: shiftwidth=2 sts=2 expandtab
--- a/src/version.c
+++ b/src/version.c
@@ -764,6 +764,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2237,
+/**/
     2236,
 /**/
     2235,