diff --git a/NEWS b/NEWS index d9527629..679d7647 100644 --- a/NEWS +++ b/NEWS @@ -1,13 +1,15 @@
 2007-xx-xx:
 	* version 0.6
-	* THIS VERSION ONLY WORKS WITH FIREFOX 3.0
-	* IMPORTANT! options are no longer automatically stored - use the
+	* THIS VERSION ONLY WORKS WITH FIREFOX 3.0 beta1 or newer
+	* IMPORTANT: options are no longer automatically stored - use the
 	  ~/.vimperatorrc file instead for persistent options
-	* IMPORTANT! Major hints rewrite
+	* IMPORTANT: Major hints rewrite
 	  read up the new help for the f, F and ; commands for details
 	  removed the following hint options: 'hintchars' 'maxhints'
 	  added the following hint options: 'hinttimeout'
+	* IMPORTANT: changed 'I' key to Ctrl-Q to also work in textboxes
+	* new ctrl-x and ctrl-a mappings to increment the last number in the URL
 	* new ~ mapping to open the home directory
 	* :open tries to open a relative filename now, if you do a :open foo.html
 	  or :open ../hello.txt;
@@ -24,7 +26,6 @@
 	* tags and keyword support for :bmark
 	* added full zoom, and changed keybindings slightly for text zoom
 	* improvements for scrollable -- more -- prompt
-	* changed 'I' key to Ctrl-Q to also work in textboxes
 	* sites like msn.com or yahoo.com don't focus search field anymore on keydown
 	* new gi browser command to focus last used input box
 	* edit TEXTAREAs with many vim commands in a vim and even visual mode if you :set noinsertmode
diff --git a/TODO b/TODO
index 404251d5..7c91dca7 100644
--- a/TODO
+++ b/TODO
@@ -40,9 +40,6 @@ RANDOM IDEAS:
 * numbered tabs
 * Would it be possible to add a setting "maxcompletionsshown" and 
   "maxpreviewwindowheight" or something like this?
-* 16:06:04       bartman| maxauthority: feature idea: what if :n and :N searched the 
-                        page and if they found a unique href=*next.* or 
-                        href=.*prev.* they would follow that link?
 * hide scrollbars: http://rafb.net/p/YHRhEe47.html (window.content.document.body.style.overflow = "hidden")
 
 
diff --git a/content/io.js b/content/io.js index fcd0c2ae..3e5a5e10 100644 --- a/content/io.js +++ b/content/io.js @@ -173,7 +173,7 @@ vimperator.IO = function () //{{{ if (!/^(file:|[a-zA-Z]:|\/)/.test(path)) // starts not with either /, C: or file: path = this.getCurrentDirectory() + (WINDOWS ? "\\" : "/") + path; // TODO: for now homedir, later relative to current dir? else - path = path.replace(/^file:/, ""); + path = path.replace(/^file:(\/\/)?/, ""); file.initWithPath(path); return file; diff --git a/content/mappings.js b/content/mappings.js index 49dde1ac..c499b76b 100644 --- a/content/mappings.js +++ b/content/mappings.js @@ -872,6 +872,44 @@ vimperator.Mappings = function () //{{{ "Works like :xall." } )); + function incrementURL(count) + { + var url = vimperator.buffer.URL; + var regex = /(.*?)(-?\d+)(\D*)$/; + + var res = url.match(regex); + if(!res || !res[2]) // no number to increment + { + vimperator.beep(); + return; + } + + var newNum = parseInt(res[2], 10) + count + ""; // "" to make sure its a string + var nums = newNum.match(/^(-?)(\d+)$/); + var oldLength = res[2].replace(/-/, "").length, newLength = nums[2].length; + newNum = nums[1] || ""; + for (let i = 0; i < oldLength - newLength; i++) + newNum += "0"; // keep leading zeros + newNum += nums[2]; + + vimperator.open(res[1] + newNum + res[3]); + } + addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], [""], + function (count) { if(count < 1) count = 1; incrementURL(-count); }, + { + shortHelp: "Decrement last number in URL", + help: "Decrements the last number in URL by 1, or by count if given.", + flags: vimperator.Mappings.flags.COUNT + } + )); + addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], [""], + function (count) { if(count < 1) count = 1; incrementURL(count); }, + { + shortHelp: "Increment last number in URL", + help: "Increments the last number in URL by 1, or by count if given.", + flags: vimperator.Mappings.flags.COUNT + } + )); // scrolling commands addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["0", "^"], @@ -1042,37 +1080,44 @@ vimperator.Mappings = function () //{{{ flags: vimperator.Mappings.flags.COUNT } )); - function isDirectory(url) - { - if (/^file:\/\/|^\//.test(url)) - { - var strippedFilename = url.replace(/^(file:\/\/)?(.*)/, "$2"); - var file = vimperator.io.getFile(strippedFilename); - if (!file || !file.isDirectory()) - return false; - else - return true; - } - - // for all other locations just check if the URL ends with / - return /\/$/.test(url); - } - addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["gu", ""], + addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["gu"], function (count) { - var gocmd = ""; - if (isDirectory(vimperator.buffer.URL)) - gocmd = "../"; - else - gocmd = "./"; + function isDirectory(url) + { + if (/^file:\/|^\//.test(url)) + { + //var strippedFilename = url.replace(/^(file:\/\/)?(.*)/, "$2"); + var file = vimperator.io.getFile(url); + if (!file.exists() || !file.isDirectory()) + return false; + else + return true; + } + + // for all other locations just check if the URL ends with / + return /\/$/.test(url); + } if (count < 1) count = 1; - for (var i = 0; i < count - 1; i++) - gocmd += "../"; + var url = vimperator.buffer.URL; + for (var i = 0; i < count; i++) + { + if (isDirectory(url)) + url = url.replace(/^(.*?:)(.*?)([^\/]+\/*)$/, "$1$2/") + else + url = url.replace(/^(.*?:)(.*?)(\/+[^\/]+)$/, "$1$2/") + } + url = url.replace(/^(.*:\/+.*?)\/+$/, "$1/"); // get rid of more than 1 / at the end - vimperator.open(gocmd); + if (url == vimperator.buffer.URL) + { + vimperator.beep(); + return; + } + vimperator.open(url); }, { shortHelp: "Go to parent directory", @@ -1080,12 +1125,21 @@ vimperator.Mappings = function () //{{{ flags: vimperator.Mappings.flags.COUNT } )); - addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["gU", ""], - function () { vimperator.open("..."); }, + addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["gU"], + function () + { + var uri = content.document.location; + if (/(about|mailto):/.test(uri.protocol)) // exclude these special protocols for now + { + vimperator.beep(); + return; + } + vimperator.open(uri.protocol + "//" + (uri.host || "") + "/"); + }, { shortHelp: "Go to the root of the website", help: "gU on http://www.example.com/dir1/dir2/file.htm opens http://www.example.com/.
" + - "When browsing a local directory, it goes to the root document." + "When browsing a local directory, it goes to the root directory." } )); diff --git a/content/util.js b/content/util.js index 97c5a4ca..156cfca7 100644 --- a/content/util.js +++ b/content/util.js @@ -98,21 +98,19 @@ vimperator.util = { //{{{ begin: for (var url = 0; url < urls.length; url++) { - var newURL = vimperator.buffer.URL; - var matches; - // strip each 'URL' - makes things simpler later on urls[url] = urls[url].replace(/^\s+/, "").replace(/\s+$/, ""); // first check if it is an existing local file var file = vimperator.io.getFile(urls[url]); - if (file.exists()) + if (file.exists() && file.isReadable()) { urls[url] = file.path; continue; } // Disabled for now, use gu and GU or O and change the last part +// var newURL = vimperator.buffer.URL; // // FIXME: not really that good (doesn't handle .. in the middle) // // check for ./ and ../ (or even .../) to go to a file in the upper directory // if (matches = urls[url].match(/^(?:\.$|\.\/(\S*))/)) @@ -138,6 +136,7 @@ vimperator.util = { //{{{ // if the string doesn't look like a valid URL (i.e. contains a space // or does not contain any of: .:/) try opening it with a search engine // or keyword bookmark + var matches; if (/\s/.test(urls[url]) || !/[.:\/]/.test(urls[url])) { matches = urls[url].match(/^(\S+)(?:\s+(.+))?$/); diff --git a/install.rdf b/install.rdf index 046c268f..839bd5a7 100644 --- a/install.rdf +++ b/install.rdf @@ -20,7 +20,7 @@ {ec8030f7-c20a-464f-9b0e-13a3a9e97384} - 3.0a7 + 3.0b1 3.0.0.*