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

all mappings apart from various insert modes are finally there where they should be

This commit is contained in:
Martin Stubenschrott
2008-02-24 01:47:47 +00:00
parent 800516acba
commit f86df3e65a
10 changed files with 521 additions and 548 deletions

View File

@@ -105,6 +105,26 @@ vimperator.Bookmarks = function () //{{{
"Speed up first time history/bookmark completion",
"boolean", true);
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// MAPPINGS ////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
var modes = vimperator.config.browserModes || [vimperator.modes.NORMAL];
vimperator.mappings.add(modes, ["a"],
"Open a prompt to bookmark the current URL",
function ()
{
var title = "";
if (vimperator.buffer.title != vimperator.buffer.URL)
title = " -title=\"" + vimperator.buffer.title + "\"";
vimperator.commandline.open(":", "bmark " + vimperator.buffer.URL + title, vimperator.modes.EX);
});
vimperator.mappings.add(modes, ["A"],
"Toggle bookmarked state of current URL",
function () { vimperator.bookmarks.toggle(vimperator.buffer.URL); });
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// PUBLIC SECTION //////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
@@ -437,6 +457,31 @@ vimperator.History = function () //{{{
rootNode.containerOpen = false;
}
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// MAPPINGS ////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
var modes = vimperator.config.browserModes || [vimperator.modes.NORMAL];
vimperator.mappings.add(modes,
["<C-o>"], "Go to an older position in the jump list",
function (count) { vimperator.history.stepTo(-(count > 1 ? count : 1)); },
{ flags: vimperator.Mappings.flags.COUNT });
vimperator.mappings.add(modes,
["<C-i>"], "Go to a newer position in the jump list",
function (count) { vimperator.history.stepTo(count > 1 ? count : 1); },
{ flags: vimperator.Mappings.flags.COUNT });
vimperator.mappings.add(modes,
["H", "<A-Left>", "<M-Left>"], "Go back in the browser history",
function (count) { vimperator.history.stepTo(-(count > 1 ? count : 1)); },
{ flags: vimperator.Mappings.flags.COUNT });
vimperator.mappings.add(modes,
["L", "<A-Right>", "<M-Right>"], "Go forward in the browser history",
function (count) { vimperator.history.stepTo(count > 1 ? count : 1); },
{ flags: vimperator.Mappings.flags.COUNT });
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// PUBLIC SECTION //////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
@@ -556,265 +601,6 @@ vimperator.History = function () //{{{
//}}}
}; //}}}
vimperator.Marks = function () //{{{
{
////////////////////////////////////////////////////////////////////////////////
////////////////////// PRIVATE SECTION /////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
var localMarks = {};
var urlMarks = {};
var pendingJumps = [];
var appContent = document.getElementById("appcontent");
if (appContent)
appContent.addEventListener("load", onPageLoad, true);
function onPageLoad(event)
{
var win = event.originalTarget.defaultView;
for (var i = 0, length = pendingJumps.length; i < length; i++)
{
var mark = pendingJumps[i];
if (win.location.href == mark.location)
{
win.scrollTo(mark.position.x * win.scrollMaxX, mark.position.y * win.scrollMaxY);
pendingJumps.splice(i, 1);
return;
}
}
}
function removeLocalMark(mark)
{
if (mark in localMarks)
{
var win = window.content;
for (var i = 0; i < localMarks[mark].length; i++)
{
if (localMarks[mark][i].location == win.location.href)
{
vimperator.log("Deleting local mark: " + mark + " | " + localMarks[mark][i].location + " | (" + localMarks[mark][i].position.x + ", " + localMarks[mark][i].position.y + ") | tab: " + vimperator.tabs.index(localMarks[mark][i].tab), 5);
localMarks[mark].splice(i, 1);
if (localMarks[mark].length == 0)
delete localMarks[mark];
break;
}
}
}
}
function removeURLMark(mark)
{
if (mark in urlMarks)
{
vimperator.log("Deleting URL mark: " + mark + " | " + urlMarks[mark].location + " | (" + urlMarks[mark].position.x + ", " + urlMarks[mark].position.y + ") | tab: " + vimperator.tabs.index(urlMarks[mark].tab), 5);
delete urlMarks[mark];
}
}
function isLocalMark(mark)
{
return /^[a-z]$/.test(mark);
}
function isURLMark(mark)
{
return /^[A-Z0-9]$/.test(mark);
}
function getSortedMarks()
{
// local marks
var lmarks = [];
for (var mark in localMarks)
{
for (var i = 0; i < localMarks[mark].length; i++)
{
if (localMarks[mark][i].location == window.content.location.href)
lmarks.push([mark, localMarks[mark][i]]);
}
}
lmarks.sort();
// URL marks
var umarks = [];
for (var mark in urlMarks)
umarks.push([mark, urlMarks[mark]]);
// FIXME: why does umarks.sort() cause a "Component is not available =
// NS_ERROR_NOT_AVAILABLE" exception when used here?
umarks.sort(function (a, b) {
if (a[0] < b[0])
return -1;
else if (a[0] > b[0])
return 1;
else
return 0;
});
return lmarks.concat(umarks);
}
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// PUBLIC SECTION //////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
return {
// TODO: add support for frameset pages
add: function (mark)
{
var win = window.content;
if (win.document.body.localName.toLowerCase() == "frameset")
{
vimperator.echoerr("marks support for frameset pages not implemented yet");
return;
}
var x = win.scrollMaxX ? win.pageXOffset / win.scrollMaxX : 0;
var y = win.scrollMaxY ? win.pageYOffset / win.scrollMaxY : 0;
var position = { x: x, y: y };
if (isURLMark(mark))
{
vimperator.log("Adding URL mark: " + mark + " | " + win.location.href + " | (" + position.x + ", " + position.y + ") | tab: " + vimperator.tabs.index(vimperator.tabs.getTab()), 5);
urlMarks[mark] = { location: win.location.href, position: position, tab: vimperator.tabs.getTab() };
}
else if (isLocalMark(mark))
{
// remove any previous mark of the same name for this location
removeLocalMark(mark);
if (!localMarks[mark])
localMarks[mark] = [];
vimperator.log("Adding local mark: " + mark + " | " + win.location.href + " | (" + position.x + ", " + position.y + ")", 5);
localMarks[mark].push({ location: win.location.href, position: position });
}
},
remove: function (filter, special)
{
if (special)
{
// :delmarks! only deletes a-z marks
for (var mark in localMarks)
removeLocalMark(mark);
}
else
{
var pattern = new RegExp("[" + filter.replace(/\s+/g, "") + "]");
for (var mark in urlMarks)
{
if (pattern.test(mark))
removeURLMark(mark);
}
for (var mark in localMarks)
{
if (pattern.test(mark))
removeLocalMark(mark);
}
}
},
jumpTo: function (mark)
{
var ok = false;
if (isURLMark(mark))
{
var slice = urlMarks[mark];
if (slice && slice.tab && slice.tab.linkedBrowser)
{
if (!slice.tab.parentNode)
{
pendingJumps.push(slice);
// NOTE: this obviously won't work on generated pages using
// non-unique URLs, like Vimperator's help :(
vimperator.open(slice.location, vimperator.NEW_TAB);
return;
}
var index = vimperator.tabs.index(slice.tab);
if (index != -1)
{
vimperator.tabs.select(index);
var win = slice.tab.linkedBrowser.contentWindow;
if (win.location.href != slice.location)
{
pendingJumps.push(slice);
win.location.href = slice.location;
return;
}
vimperator.log("Jumping to URL mark: " + mark + " | " + slice.location + " | (" + slice.position.x + ", " + slice.position.y + ") | tab: " + vimperator.tabs.index(slice.tab), 5);
win.scrollTo(slice.position.x * win.scrollMaxX, slice.position.y * win.scrollMaxY);
ok = true;
}
}
}
else if (isLocalMark(mark))
{
var win = window.content;
var slice = localMarks[mark] || [];
for (var i = 0; i < slice.length; i++)
{
if (win.location.href == slice[i].location)
{
vimperator.log("Jumping to local mark: " + mark + " | " + slice[i].location + " | (" + slice[i].position.x + ", " + slice[i].position.y + ")", 5);
win.scrollTo(slice[i].position.x * win.scrollMaxX, slice[i].position.y * win.scrollMaxY);
ok = true;
}
}
}
if (!ok)
vimperator.echoerr("E20: Mark not set"); // FIXME: move up?
},
list: function (filter)
{
var marks = getSortedMarks();
if (marks.length == 0)
{
vimperator.echoerr("No marks set");
return;
}
if (filter.length > 0)
{
marks = marks.filter(function (mark) {
if (filter.indexOf(mark[0]) > -1)
return mark;
});
if (marks.length == 0)
{
vimperator.echoerr("E283: No marks matching \"" + filter + "\"");
return;
}
}
var list = ":" + vimperator.util.escapeHTML(vimperator.commandline.getCommand()) + "<br/>" +
"<table><tr align=\"left\" class=\"hl-Title\"><th>mark</th><th>line</th><th>col</th><th>file</th></tr>";
for (var i = 0; i < marks.length; i++)
{
list += "<tr>" +
"<td> " + marks[i][0] + "</td>" +
"<td align=\"right\">" + Math.round(marks[i][1].position.y * 100) + "%</td>" +
"<td align=\"right\">" + Math.round(marks[i][1].position.x * 100) + "%</td>" +
"<td style=\"color: green;\">" + vimperator.util.escapeHTML(marks[i][1].location) + "</td>" +
"</tr>";
}
list += "</table>";
vimperator.commandline.echo(list, vimperator.commandline.HL_NORMAL, vimperator.commandline.FORCE_MULTILINE);
}
};
//}}}
}; //}}}
vimperator.QuickMarks = function () //{{{
{
////////////////////////////////////////////////////////////////////////////////
@@ -831,6 +617,40 @@ vimperator.QuickMarks = function () //{{{
qmarks[savedMarks[i]] = savedMarks[i + 1];
}
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// MAPPINGS ////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
var modes = vimperator.config.browserModes || [vimperator.modes.NORMAL];
vimperator.mappings.add(modes,
["go"], "Jump to a QuickMark",
function (arg) { vimperator.quickmarks.jumpTo(arg, vimperator.CURRENT_TAB); },
{ flags: vimperator.Mappings.flags.ARGUMENT });
vimperator.mappings.add(modes,
["gn"], "Jump to a QuickMark in a new tab",
function (arg)
{
vimperator.quickmarks.jumpTo(arg,
/\bquickmark\b/.test(vimperator.options["activate"]) ?
vimperator.NEW_TAB : vimperator.NEW_BACKGROUND_TAB);
},
{ flags: vimperator.Mappings.flags.ARGUMENT });
vimperator.mappings.add(modes,
["M"], "Add new QuickMark for current URL",
function (arg)
{
if (/[^a-zA-Z0-9]/.test(arg))
{
vimperator.beep();
return;
}
vimperator.quickmarks.add(arg, vimperator.buffer.URL);
},
{ flags: vimperator.Mappings.flags.ARGUMENT });
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// PUBLIC SECTION //////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{

View File

@@ -26,12 +26,11 @@ the provisions above, a recipient may use your version of this file under
the terms of any one of the MPL, the GPL or the LGPL.
}}} ***** END LICENSE BLOCK *****/
vimperator.Buffer = function (browserModes) //{{{
vimperator.Buffer = function () //{{{
{
////////////////////////////////////////////////////////////////////////////////
////////////////////// PRIVATE SECTION /////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
var modes = browserModes || [vimperator.modes.NORMAL];
var zoomLevels = [ 1, 10, 25, 50, 75, 90, 100,
120, 150, 200, 300, 500, 1000, 2000 ];
@@ -185,6 +184,7 @@ vimperator.Buffer = function (browserModes) //{{{
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// MAPPINGS ////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
var modes = vimperator.config.browserModes || [vimperator.modes.NORMAL];
vimperator.mappings.add(modes, ["i", "<Insert>"],
"Start caret mode",
@@ -312,11 +312,6 @@ vimperator.Buffer = function (browserModes) //{{{
vimperator.NEW_BACKGROUND_TAB : vimperator.NEW_TAB);
});
vimperator.mappings.add(modes, ["'", "`"],
"Jump to the mark in the current buffer",
function (arg) { vimperator.marks.jumpTo(arg); },
{ flags: vimperator.Mappings.flags.ARGUMENT });
vimperator.mappings.add(modes, ["p", "<MiddleMouse>"],
"Open (put) a URL based on the current clipboard contents in the current buffer",
function () { vimperator.open(readFromClipboard()); });
@@ -330,7 +325,7 @@ vimperator.Buffer = function (browserModes) //{{{
vimperator.NEW_TAB : vimperator.NEW_BACKGROUND_TAB);
});
// reload
// reloading
vimperator.mappings.add(modes, ["r"],
"Reload current page",
function () { vimperator.tabs.reload(getBrowser().mCurrentTab, false); });
@@ -339,7 +334,19 @@ vimperator.Buffer = function (browserModes) //{{{
"Reload while skipping the cache",
function () { vimperator.tabs.reload(getBrowser().mCurrentTab, true); });
// zoom
// yanking
vimperator.options.add(modes, ["Y"],
"Copy selected text",
function ()
{
var sel = window.content.document.getSelection();
if (sel)
vimperator.copyToClipboard(sel, true);
else
vimperator.beep();
});
// zooming
vimperator.mappings.add(modes, ["zi", "+"],
"Enlarge text zoom of current web page",
function (count) { vimperator.buffer.zoomIn(count > 1 ? count : 1, false); },
@@ -1225,4 +1232,291 @@ vimperator.Buffer = function (browserModes) //{{{
//}}}
}; //}}}
vimperator.Marks = function () //{{{
{
////////////////////////////////////////////////////////////////////////////////
////////////////////// PRIVATE SECTION /////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
var localMarks = {};
var urlMarks = {};
var pendingJumps = [];
var appContent = document.getElementById("appcontent");
if (appContent)
appContent.addEventListener("load", onPageLoad, true);
function onPageLoad(event)
{
var win = event.originalTarget.defaultView;
for (var i = 0, length = pendingJumps.length; i < length; i++)
{
var mark = pendingJumps[i];
if (win.location.href == mark.location)
{
win.scrollTo(mark.position.x * win.scrollMaxX, mark.position.y * win.scrollMaxY);
pendingJumps.splice(i, 1);
return;
}
}
}
function removeLocalMark(mark)
{
if (mark in localMarks)
{
var win = window.content;
for (var i = 0; i < localMarks[mark].length; i++)
{
if (localMarks[mark][i].location == win.location.href)
{
vimperator.log("Deleting local mark: " + mark + " | " + localMarks[mark][i].location + " | (" + localMarks[mark][i].position.x + ", " + localMarks[mark][i].position.y + ") | tab: " + vimperator.tabs.index(localMarks[mark][i].tab), 5);
localMarks[mark].splice(i, 1);
if (localMarks[mark].length == 0)
delete localMarks[mark];
break;
}
}
}
}
function removeURLMark(mark)
{
if (mark in urlMarks)
{
vimperator.log("Deleting URL mark: " + mark + " | " + urlMarks[mark].location + " | (" + urlMarks[mark].position.x + ", " + urlMarks[mark].position.y + ") | tab: " + vimperator.tabs.index(urlMarks[mark].tab), 5);
delete urlMarks[mark];
}
}
function isLocalMark(mark)
{
return /^[a-z]$/.test(mark);
}
function isURLMark(mark)
{
return /^[A-Z0-9]$/.test(mark);
}
function getSortedMarks()
{
// local marks
var lmarks = [];
for (var mark in localMarks)
{
for (var i = 0; i < localMarks[mark].length; i++)
{
if (localMarks[mark][i].location == window.content.location.href)
lmarks.push([mark, localMarks[mark][i]]);
}
}
lmarks.sort();
// URL marks
var umarks = [];
for (var mark in urlMarks)
umarks.push([mark, urlMarks[mark]]);
// FIXME: why does umarks.sort() cause a "Component is not available =
// NS_ERROR_NOT_AVAILABLE" exception when used here?
umarks.sort(function (a, b) {
if (a[0] < b[0])
return -1;
else if (a[0] > b[0])
return 1;
else
return 0;
});
return lmarks.concat(umarks);
}
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// MAPPINGS ////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
var modes = vimperator.config.browserModes || [vimperator.modes.NORMAL];
vimperator.mappings.add(modes,
["m"], "Set mark at the cursor position",
function (arg)
{
if (/[^a-zA-Z]/.test(arg))
{
vimperator.beep();
return;
}
vimperator.marks.add(arg);
},
{ flags: vimperator.Mappings.flags.ARGUMENT });
vimperator.mappings.add(modes,
["'", "`"], "Jump to the mark in the current buffer",
function (arg) { vimperator.marks.jumpTo(arg); },
{ flags: vimperator.Mappings.flags.ARGUMENT });
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// PUBLIC SECTION //////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
return {
// TODO: add support for frameset pages
add: function (mark)
{
var win = window.content;
if (win.document.body.localName.toLowerCase() == "frameset")
{
vimperator.echoerr("marks support for frameset pages not implemented yet");
return;
}
var x = win.scrollMaxX ? win.pageXOffset / win.scrollMaxX : 0;
var y = win.scrollMaxY ? win.pageYOffset / win.scrollMaxY : 0;
var position = { x: x, y: y };
if (isURLMark(mark))
{
vimperator.log("Adding URL mark: " + mark + " | " + win.location.href + " | (" + position.x + ", " + position.y + ") | tab: " + vimperator.tabs.index(vimperator.tabs.getTab()), 5);
urlMarks[mark] = { location: win.location.href, position: position, tab: vimperator.tabs.getTab() };
}
else if (isLocalMark(mark))
{
// remove any previous mark of the same name for this location
removeLocalMark(mark);
if (!localMarks[mark])
localMarks[mark] = [];
vimperator.log("Adding local mark: " + mark + " | " + win.location.href + " | (" + position.x + ", " + position.y + ")", 5);
localMarks[mark].push({ location: win.location.href, position: position });
}
},
remove: function (filter, special)
{
if (special)
{
// :delmarks! only deletes a-z marks
for (var mark in localMarks)
removeLocalMark(mark);
}
else
{
var pattern = new RegExp("[" + filter.replace(/\s+/g, "") + "]");
for (var mark in urlMarks)
{
if (pattern.test(mark))
removeURLMark(mark);
}
for (var mark in localMarks)
{
if (pattern.test(mark))
removeLocalMark(mark);
}
}
},
jumpTo: function (mark)
{
var ok = false;
if (isURLMark(mark))
{
var slice = urlMarks[mark];
if (slice && slice.tab && slice.tab.linkedBrowser)
{
if (!slice.tab.parentNode)
{
pendingJumps.push(slice);
// NOTE: this obviously won't work on generated pages using
// non-unique URLs, like Vimperator's help :(
vimperator.open(slice.location, vimperator.NEW_TAB);
return;
}
var index = vimperator.tabs.index(slice.tab);
if (index != -1)
{
vimperator.tabs.select(index);
var win = slice.tab.linkedBrowser.contentWindow;
if (win.location.href != slice.location)
{
pendingJumps.push(slice);
win.location.href = slice.location;
return;
}
vimperator.log("Jumping to URL mark: " + mark + " | " + slice.location + " | (" + slice.position.x + ", " + slice.position.y + ") | tab: " + vimperator.tabs.index(slice.tab), 5);
win.scrollTo(slice.position.x * win.scrollMaxX, slice.position.y * win.scrollMaxY);
ok = true;
}
}
}
else if (isLocalMark(mark))
{
var win = window.content;
var slice = localMarks[mark] || [];
for (var i = 0; i < slice.length; i++)
{
if (win.location.href == slice[i].location)
{
vimperator.log("Jumping to local mark: " + mark + " | " + slice[i].location + " | (" + slice[i].position.x + ", " + slice[i].position.y + ")", 5);
win.scrollTo(slice[i].position.x * win.scrollMaxX, slice[i].position.y * win.scrollMaxY);
ok = true;
}
}
}
if (!ok)
vimperator.echoerr("E20: Mark not set"); // FIXME: move up?
},
list: function (filter)
{
var marks = getSortedMarks();
if (marks.length == 0)
{
vimperator.echoerr("No marks set");
return;
}
if (filter.length > 0)
{
marks = marks.filter(function (mark) {
if (filter.indexOf(mark[0]) > -1)
return mark;
});
if (marks.length == 0)
{
vimperator.echoerr("E283: No marks matching \"" + filter + "\"");
return;
}
}
var list = ":" + vimperator.util.escapeHTML(vimperator.commandline.getCommand()) + "<br/>" +
"<table><tr align=\"left\" class=\"hl-Title\"><th>mark</th><th>line</th><th>col</th><th>file</th></tr>";
for (var i = 0; i < marks.length; i++)
{
list += "<tr>" +
"<td> " + marks[i][0] + "</td>" +
"<td align=\"right\">" + Math.round(marks[i][1].position.y * 100) + "%</td>" +
"<td align=\"right\">" + Math.round(marks[i][1].position.x * 100) + "%</td>" +
"<td style=\"color: green;\">" + vimperator.util.escapeHTML(marks[i][1].location) + "</td>" +
"</tr>";
}
list += "</table>";
vimperator.commandline.echo(list, vimperator.commandline.HL_NORMAL, vimperator.commandline.FORCE_MULTILINE);
}
};
//}}}
}; //}}}
// vim: set fdm=marker sw=4 ts=4 et:

View File

@@ -144,23 +144,25 @@ vimperator.Search = function () //{{{
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// MAPPINGS ////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
vimperator.mappings.add([vimperator.modes.NORMAL], ["/"],
"Search forward for a pattern",
var modes = vimperator.config.browserModes || [vimperator.modes.NORMAL];
vimperator.mappings.add(modes,
["/"], "Search forward for a pattern",
function () { vimperator.search.openSearchDialog(vimperator.modes.SEARCH_FORWARD); });
vimperator.mappings.add([vimperator.modes.NORMAL], ["?"],
"Search backwards for a pattern",
vimperator.mappings.add(modes,
["?"], "Search backwards for a pattern",
function () { vimperator.search.openSearchDialog(vimperator.modes.SEARCH_BACKWARD); });
vimperator.mappings.add([vimperator.modes.NORMAL], ["n"],
"Find next",
vimperator.mappings.add(modes,
["n"], "Find next",
function () { vimperator.search.findAgain(false); });
vimperator.mappings.add([vimperator.modes.NORMAL], ["N"],
"Find previous",
vimperator.mappings.add(modes,
["N"], "Find previous",
function () { vimperator.search.findAgain(true); });
vimperator.mappings.add([vimperator.modes.NORMAL, vimperator.modes.CARET, vimperator.modes.TEXTAREA], ["*"],
vimperator.mappings.add(modes.concat([vimperator.modes.CARET, vimperator.modes.TEXTAREA]), ["*"],
"Find word under cursor",
function ()
{
@@ -168,7 +170,7 @@ vimperator.Search = function () //{{{
vimperator.search.findAgain();
});
vimperator.mappings.add([vimperator.modes.NORMAL, vimperator.modes.CARET, vimperator.modes.TEXTAREA], ["#"],
vimperator.mappings.add(modes.concat([vimperator.modes.CARET, vimperator.modes.TEXTAREA]), ["#"],
"Find word under cursor backwards",
function ()
{

View File

@@ -26,12 +26,11 @@ the provisions above, a recipient may use your version of this file under
the terms of any one of the MPL, the GPL or the LGPL.
}}} ***** END LICENSE BLOCK *****/
vimperator.Mail = function (validModes)
vimperator.Mail = function ()
{
////////////////////////////////////////////////////////////////////////////////
////////////////////// PRIVATE SECTION /////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
var modes = validModes || [vimperator.modes.NORMAL];
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// OPTIONS /////////////////////////////////////////////////
@@ -47,6 +46,7 @@ vimperator.Mail = function (validModes)
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// MAPPINGS ////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
var modes = vimperator.config.mailModes || [vimperator.modes.NORMAL];
vimperator.mappings.add(modes, ["<Return>", "i"],
"Focus message",

View File

@@ -181,18 +181,6 @@ vimperator.Mappings = function () //{{{
return mappingsIterator([vimperator.modes.NORMAL], main);
},
// FIXME: unused?
/*getDefaultIterator: function (mode)
{
return mappingsIterator(mode, main);
},
// FIXME: unused?
getUserIterator: function (mode)
{
return mappingsIterator(mode, user);
},*/
add: function (modes, keys, description, action, extra)
{
addMap (new vimperator.Map(modes, keys,
@@ -351,226 +339,6 @@ vimperator.Mappings = function () //{{{
////////////////////// DEFAULT MAPPINGS ////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
//
// NORMAL mode
// {{{
// move to bookmarks.js:
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["a"],
function ()
{
var title = "";
if (vimperator.buffer.title != vimperator.buffer.URL)
title = " -title=\"" + vimperator.buffer.title + "\"";
vimperator.commandline.open(":", "bmark " + vimperator.buffer.URL + title, vimperator.modes.EX);
},
{ shortHelp: "Open a prompt to bookmark the current URL" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["A"],
function () { vimperator.bookmarks.toggle(vimperator.buffer.URL); },
{ shortHelp: "Toggle bookmarked state of current URL" }
));
// move to vimperator.js:
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["~"],
function () { vimperator.open("~"); },
{ shortHelp: "Open home directory" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["gh"],
function() { BrowserHome(); },
{ shortHelp: "Go home" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["gH"],
function ()
{
var homepages = gHomeButton.getHomePage();
vimperator.open(homepages, /\bhomepage\b/.test(vimperator.options["activate"]) ?
vimperator.NEW_TAB : vimperator.NEW_BACKGROUND_TAB);
},
{ shortHelp: "Go home in a new tab" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["gu"],
function (count)
{
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;
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
if (url == vimperator.buffer.URL)
{
vimperator.beep();
return;
}
vimperator.open(url);
},
{
shortHelp: "Go to parent directory",
flags: vimperator.Mappings.flags.COUNT
}
));
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" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["o"],
function () { vimperator.commandline.open(":", "open ", vimperator.modes.EX); },
{ shortHelp: "Open one or more URLs in the current tab" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["O"],
function () { vimperator.commandline.open(":", "open " + vimperator.buffer.URL, vimperator.modes.EX); },
{ shortHelp: "Open one or more URLs in the current tab, based on current location" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["<C-l>"],
function () { vimperator.commands.redraw(); },
{ shortHelp: "Redraw the screen" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["t"],
function () { vimperator.commandline.open(":", "tabopen ", vimperator.modes.EX); },
{ shortHelp: "Open one or more URLs in a new tab" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["T"],
function () { vimperator.commandline.open(":", "tabopen " + vimperator.buffer.URL, vimperator.modes.EX); },
{ shortHelp: "Open one or more URLs in a new tab, based on current location" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["y"],
function () { vimperator.copyToClipboard(vimperator.buffer.URL, true); },
{ shortHelp: "Yank current location to the clipboard" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL, vimperator.modes.VISUAL], ["Y"],
function ()
{
var sel = window.content.document.getSelection();
if (sel)
vimperator.copyToClipboard(sel, true);
else
vimperator.beep();
},
{ shortHelp: "Copy selected text" }
));
// move to quickmarks:
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["go"],
function (arg) { vimperator.quickmarks.jumpTo(arg, vimperator.CURRENT_TAB); },
{
shortHelp: "Jump to a QuickMark in the current tab",
flags: vimperator.Mappings.flags.ARGUMENT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["gn"],
function (arg)
{
vimperator.quickmarks.jumpTo(arg,
/\bquickmark\b/.test(vimperator.options["activate"]) ?
vimperator.NEW_TAB : vimperator.NEW_BACKGROUND_TAB);
},
{
shortHelp: "Jump to a QuickMark in a new tab",
flags: vimperator.Mappings.flags.ARGUMENT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["M"],
function (arg)
{
if (/[^a-zA-Z0-9]/.test(arg))
{
vimperator.beep();
return;
}
vimperator.quickmarks.add(arg, vimperator.buffer.URL);
},
{
shortHelp: "Add new QuickMark for current URL",
flags: vimperator.Mappings.flags.ARGUMENT
}
));
// move to v.Marks:
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["m"],
function (arg)
{
if (/[^a-zA-Z]/.test(arg))
{
vimperator.beep();
return;
}
vimperator.marks.add(arg);
},
{
shortHelp: "Set mark at the cursor position",
flags: vimperator.Mappings.flags.ARGUMENT
}
));
// history manipulation and jumplist, move to bookmarks.js
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["<C-o>"],
function (count) { vimperator.history.stepTo(-(count > 1 ? count : 1)); },
{
shortHelp: "Go to an older position in the jump list",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["<C-i>"],
function (count) { vimperator.history.stepTo(count > 1 ? count : 1); },
{
shortHelp: "Go to a newer position in the jump list",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["H", "<A-Left>", "<M-Left>"],
function (count) { vimperator.history.stepTo(-(count > 1 ? count : 1)); },
{
shortHelp: "Go back in the browser history",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["L", "<A-Right>", "<M-Right>"],
function (count) { vimperator.history.stepTo(count > 1 ? count : 1); },
{
shortHelp: "Go forward in the browser history",
flags: vimperator.Mappings.flags.COUNT
}
));
// }}}
// CARET mode, most commands should be moved to buffer.js i guess
// {{{
@@ -1179,20 +947,6 @@ vimperator.Mappings = function () //{{{
));
//}}}
// COMMAND_LINE mode, move to ui.js
//{{{
addDefaultMap(new vimperator.Map([vimperator.modes.COMMAND_LINE], ["<Space>"],
function () { return vimperator.editor.expandAbbreviation("c"); },
{ flags: vimperator.Mappings.flags.ALLOW_EVENT_ROUTING }
));
addDefaultMap(new vimperator.Map([vimperator.modes.COMMAND_LINE], ["<C-]>", "<C-5>"],
function () { vimperator.editor.expandAbbreviation("c"); }, { }
));
//}}} }}}
return mappingManager;
}; //}}}

View File

@@ -32,12 +32,20 @@ vimperator.config = {
hostApplication: "Thunderbird", // TODO: can this be found out otherwise?
/*** optional options, there are checked for existance and a fallback provided ***/
features: ["hints", "mail", "marks"],
get browserModes() { return [vimperator.modes.MESSAGE]; },
features: ["mail", "hints"],
get mainWidget() { return GetThreadTree(); }, // focusContent() focuses this widget
mainWindowID: "messengerWindow", // used for :set titlestring
dialogs: [],
guioptions: { m: ["mail-toolbar-menubar2"], T: ["mail-bar2"], f: ["folderPaneBox", "folderpane_splitter"], F: ["folderPaneHeader"] }
guioptions: { m: ["mail-toolbar-menubar2"], T: ["mail-bar2"], f: ["folderPaneBox", "folderpane_splitter"], F: ["folderPaneHeader"] },
init: function()
{
vimperator.mappings.add([vimperator.modes.NORMAL],
["o"], "Open one or more URLs",
function () { vimperator.commandline.open(":", "open ", vimperator.modes.EX); });
}
}
// vim: set fdm=marker sw=4 ts=4 et:

View File

@@ -26,7 +26,7 @@ the provisions above, a recipient may use your version of this file under
the terms of any one of the MPL, the GPL or the LGPL.
}}} ***** END LICENSE BLOCK *****/
// do NOT create instances of this class yourself, use the helper method
// Do NOT create instances of this class yourself, use the helper method
// vimperator.options.add() instead
vimperator.Option = function (names, description, type, defaultValue, getter, setter, validator, completer)
{
@@ -103,8 +103,6 @@ vimperator.Option = function (names, description, type, defaultValue, getter, se
}; //}}}
vimperator.Options = function () //{{{
{
////////////////////////////////////////////////////////////////////////////////
@@ -287,21 +285,6 @@ vimperator.Options = function () //{{{
vimperator.commandline.echo(list, vimperator.commandline.HL_NORMAL, vimperator.commandline.FORCE_MULTILINE);
},
// TODO: move to vim.js?
// this hack is only needed, because we need to do asynchronous loading of the .vimperatorrc
setInitialGUI: function ()
{
if (vimperator.config.name != "Vimperator")
return;
if (!guioptionsDone)
this.get("guioptions").reset();
if (!laststatusDone)
this.get("laststatus").reset();
if (!showtablineDone)
this.get("showtabline").reset();
},
listPrefs: function (onlyNonDefault, filter)
{
if (!filter)

View File

@@ -273,6 +273,21 @@ vimperator.CommandLine = function () //{{{
validator: function (value) { return /^(sort|)$/.test(value); }
});
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// MAPPINGS ////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
var modes = [vimperator.modes.COMMAND_LINE];
vimperator.mappings.add(modes,
["<Space>"], "Expand command line abbreviation",
function () { return vimperator.editor.expandAbbreviation("c"); },
{ flags: vimperator.Mappings.flags.ALLOW_EVENT_ROUTING });
vimperator.mappings.add(modes,
["<C-]>", "<C-5>"], "Expand command line abbreviation",
function () { vimperator.editor.expandAbbreviation("c"); });
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// PUBLIC SECTION //////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{

View File

@@ -491,7 +491,7 @@ const vimperator = (function () //{{{
log("preview window"); vimperator.previewwindow = vimperator.InformationList("vimperator-previewwindow", { incrementalFill: false, maxItems: 10 });
log("buffer window"); vimperator.bufferwindow = vimperator.InformationList("vimperator-bufferwindow", { incrementalFill: false, maxItems: 10 });
log("statusline"); vimperator.statusline = vimperator.StatusLine();
log("buffer"); vimperator.buffer = vimperator.Buffer(vimperator.config.browserModes || [vimperator.modes.NORMAL]);
log("buffer"); vimperator.buffer = vimperator.Buffer();
log("editor"); vimperator.editor = vimperator.Editor();
log("autocommands"); vimperator.autocommands = vimperator.AutoCommands();
log("io"); vimperator.io = vimperator.IO();
@@ -500,7 +500,7 @@ const vimperator = (function () //{{{
// optional modules
if (vimperator.has("bookmarks")) { log("bookmarks"); vimperator.bookmarks = vimperator.Bookmarks(); }
if (vimperator.has("history")) { log("history"); vimperator.history = vimperator.History(); }
if (vimperator.has("mail")) { log("mail"); vimperator.mail = vimperator.Mail(vimperator.config.mailModes || [vimperator.modes.NORMAL]); }
if (vimperator.has("mail")) { log("mail"); vimperator.mail = vimperator.Mail(); }
if (vimperator.has("tabs")) { log("tabs"); vimperator.tabs = vimperator.Tabs(); }
if (vimperator.has("marks")) { log("marks"); vimperator.marks = vimperator.Marks(); }
if (vimperator.has("quickmarks")) { log("quickmarks"); vimperator.quickmarks = vimperator.QuickMarks(); }

View File

@@ -61,6 +61,27 @@ vimperator.config = {
vimperator.open(matches[1] + newNum + matches[3]);
}
vimperator.mappings.add([vimperator.modes.NORMAL],
["y"], "Yank current location to the clipboard",
function () { vimperator.copyToClipboard(vimperator.buffer.URL, true); });
// opening websites
vimperator.mappings.add([vimperator.modes.NORMAL],
["o"], "Open one or more URLs",
function () { vimperator.commandline.open(":", "open ", vimperator.modes.EX); });
vimperator.mappings.add([vimperator.modes.NORMAL], ["O"],
"Open one or more URLs, based on current location",
function () { vimperator.commandline.open(":", "open " + vimperator.buffer.URL, vimperator.modes.EX); });
vimperator.mappings.add([vimperator.modes.NORMAL], ["t"],
"Open one or more URLs in a new tab",
function () { vimperator.commandline.open(":", "tabopen ", vimperator.modes.EX); });
vimperator.mappings.add([vimperator.modes.NORMAL], ["T"],
"Open one or more URLs in a new tab, based on current location",
function () { vimperator.commandline.open(":", "tabopen " + vimperator.buffer.URL, vimperator.modes.EX); });
vimperator.mappings.add([vimperator.modes.NORMAL],
["<C-a>"], "Increment last number in URL",
function (count) { incrementURL(count > 1 ? count : 1); },
@@ -70,6 +91,82 @@ vimperator.config = {
["<C-x>"], "Decrement last number in URL",
function (count) { incrementURL(-(count > 1 ? count : 1)); },
{ flags: vimperator.Mappings.flags.COUNT });
vimperator.mappings.add([vimperator.modes.NORMAL], ["~"],
"Open home directory",
function () { vimperator.open("~"); });
vimperator.mappings.add([vimperator.modes.NORMAL], ["gh"],
"Open homepage",
function() { BrowserHome(); });
vimperator.mappings.add([vimperator.modes.NORMAL], ["gH"],
"Open homepage in a new tab",
function ()
{
var homepages = gHomeButton.getHomePage();
vimperator.open(homepages, /\bhomepage\b/.test(vimperator.options["activate"]) ?
vimperator.NEW_TAB : vimperator.NEW_BACKGROUND_TAB);
});
vimperator.mappings.add([vimperator.modes.NORMAL], ["gu"],
"Go to parent directory",
function (count)
{
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;
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
if (url == vimperator.buffer.URL)
{
vimperator.beep();
return;
}
vimperator.open(url);
},
{ flags: vimperator.Mappings.flags.COUNT });
vimperator.mappings.add([vimperator.modes.NORMAL], ["gU"],
"Go to the root of the website",
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 || "") + "/");
});
vimperator.mappings.add([vimperator.modes.NORMAL], ["<C-l>"],
"Redraw the screen",
function () { vimperator.commands.redraw(); });
}
}