1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2025-12-30 10:02:27 +01:00

* merged ctrl-x/a commands

* fixes for file:/ handling
* fixed gu and gU
This commit is contained in:
Martin Stubenschrott
2007-11-22 20:00:46 +00:00
parent a09691d658
commit 794e80c1a8
6 changed files with 91 additions and 40 deletions

View File

@@ -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;

View File

@@ -872,6 +872,44 @@ vimperator.Mappings = function () //{{{
"Works like <code class=\"command\">:xall</code>."
}
));
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], ["<C-x>"],
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 <code class=\"argument\">count</code> if given.",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["<C-a>"],
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 <code class=\"argument\">count</code> 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", "<BS>"],
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", "<C-BS>"],
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: "<code class=\"mapping\">gU</code> on <code>http://www.example.com/dir1/dir2/file.htm</code> opens <code>http://www.example.com/</code>.<br/>" +
"When browsing a local directory, it goes to the root document."
"When browsing a local directory, it goes to the root directory."
}
));

View File

@@ -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+(.+))?$/);