diff --git a/NEWS b/NEWS index 0f12f958..718c0582 100644 --- a/NEWS +++ b/NEWS @@ -1,9 +1,11 @@
 2007-XX-XX:
 	* version 0.5.3
-	* new :pa[geinfo] command, and ctrl-g and g, ctrl-g mappings (thanks Marco Candrian)
 	* IMPORTANT! options are no longer automatically stored - use the
 	  ~/.vimperatorrc file instead for persistent options
+	* :tabnext and :tabprevious now accept an argument
+	* the count to gT now specifies a relative tab motion like Vim
+	* new :pa[geinfo] command, and ctrl-g and g, ctrl-g mappings (thanks Marco Candrian)
 	* added new :mkvimperatorc command
 	* remove :redraw and Ctrl-L commands as they rely on FF3 features
 	* :ls, :history and :bmarks output is now hyperlinked
diff --git a/content/commands.js b/content/commands.js
index f3def65e..f1af7797 100644
--- a/content/commands.js
+++ b/content/commands.js
@@ -178,6 +178,7 @@ vimperator.Commands = function() //{{{
         return null;
     }
 
+    // TODO: generalized 0 count handling -> "Zero count"
     // FIXME: doesn't really belong here...
     // return [null, null, null, null, heredoc_tag || false];
     //        [count, cmd, special, args] = match;
@@ -1470,10 +1471,30 @@ vimperator.Commands = function() //{{{
         }
     ));
     addDefaultCommand(new vimperator.Command(["tabn[ext]", "tn[ext]"],
-        function() { vimperator.tabs.select("+1", true); },
+        // TODO: count support
+        function(args)
         {
-            short_help: "Switch to the next tab",
-            help: "Cycles to the first tab, when the last is selected."
+            if (!args)
+            {
+                vimperator.tabs.select("+1", true);
+            }
+            else if (/^\d+$/.test(args))
+            {
+                var index = parseInt(args) - 1;
+                if (index < vimperator.tabs.count())
+                    vimperator.tabs.select(index, true);
+                else
+                    vimperator.beep();
+            }
+            else
+            {
+                vimperator.echoerr("E488: Trailing characters");
+            }
+        },
+        {
+            usage: ["tabn[ext] {count}"],
+            short_help: "Switch to the next or [count]th tab",
+            help: "Cycles to the first tab when the last is selected and {count} is not specified."
         }
     ));
     addDefaultCommand(new vimperator.Command(["tabo[nly]"],
@@ -1503,11 +1524,20 @@ vimperator.Commands = function() //{{{
         }
     ));
     addDefaultCommand(new vimperator.Command(["tabp[revious]", "tp[revious]", "tabN[ext]", "tN[ext]"],
-        function() { vimperator.tabs.select("-1", true); },
+        // TODO: count support
+        function(args)
         {
-            usage: ["tabp[revious]", "tabN[ext]"],
-            short_help: "Switch to the previous tab",
-            help: "Cycles to the last tab, when the first is selected."
+            if (!args)
+                vimperator.tabs.select("-1", true);
+            else if (/^\d+$/.test(args))
+                vimperator.tabs.select("-" + args, true); // FIXME: urgh!
+            else
+                vimperator.echoerr("E488: Trailing characters");
+        },
+        {
+            usage: ["tabp[revious] {count}"],
+            short_help: "Switch to the previous tab or go [count] tabs back",
+            help: "Wraps around from the first tab to the last tab."
         }
     ));
     addDefaultCommand(new vimperator.Command(["tabr[ewind]", "tabfir[st]"],
diff --git a/content/mappings.js b/content/mappings.js
index e1f5ba11..d57493fd 100644
--- a/content/mappings.js
+++ b/content/mappings.js
@@ -483,19 +483,19 @@ vimperator.Mappings = function() //{{{
             help: "Works like P, but inverts the 'activate' option."
         }
     ));
-    addDefaultMap(new vimperator.Map(vimperator.modes.NORMAL, ["gt", "", ""],
-        function(count) { vimperator.tabs.select(count > 0 ? count -1: "+1", count > 0 ? false : true); },
+    addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["gt", "", "", ""],
+        function(count) { vimperator.tabs.select(count > 0 ? count - 1: "+1", count > 0 ? false : true); },
         {
             short_help: "Go to the next tab",
             help: "Cycles to the first tab, when the last is selected.
Count is supported: 3gt goes to the third tab.", flags: vimperator.Mappings.flags.COUNT } )); - addDefaultMap(new vimperator.Map(vimperator.modes.NORMAL, ["gT", "", ""], - function(count) { vimperator.tabs.select(count > 0 ? count -1: "-1", count > 0 ? false : true); }, + addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["gT", "", "", ""], + function(count) { vimperator.tabs.select("-" + (count < 1 ? 1 : count), true); }, { - short_help: "Go to the previous tab", - help: "Cycles to the last tab, when the first is selected.
Count is supported: 3gT goes to the third tab.", + short_help: "Go {count} pages back", + help: "Wraps around from the first tab to the last tab.
Count is supported: 3gT goes three tabs back.", flags: vimperator.Mappings.flags.COUNT } ));