1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2025-12-22 22:37:58 +01:00
Files
pentadactyl-pm/content/mappings.js
Martin Stubenschrott e2e42c83c8 fixed F1
2008-02-01 14:12:48 +00:00

1722 lines
67 KiB
JavaScript

/***** BEGIN LICENSE BLOCK ***** {{{
Version: MPL 1.1/GPL 2.0/LGPL 2.1
The contents of this file are subject to the Mozilla Public License Version
1.1 (the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
for the specific language governing rights and limitations under the
License.
(c) 2006-2008: Martin Stubenschrott <stubenschrott@gmx.net>
Alternatively, the contents of this file may be used under the terms of
either the GNU General Public License Version 2 or later (the "GPL"), or
the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
in which case the provisions of the GPL or the LGPL are applicable instead
of those above. If you wish to allow use of your version of this file only
under the terms of either the GPL or the LGPL, and not to allow others to
use your version of this file under the terms of the MPL, indicate your
decision by deleting the provisions above and replace them with the notice
and other provisions required by the GPL or the LGPL. If you do not delete
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.Map = function (modes, cmds, action, extraInfo) //{{{
{
if (!modes || (!cmds || !cmds.length) || !action)
return null;
this.modes = modes;
this.names = cmds;
this.action = action;
if (extraInfo)
{
this.flags = extraInfo.flags || 0;
this.shortHelp = extraInfo.shortHelp || "";
this.rhs = extraInfo.rhs || null;
this.noremap = extraInfo.noremap || false;
}
};
vimperator.Map.prototype = {
hasName: function (name)
{
return this.names.some(function (e) { return e == name; });
},
execute: function (motion, count, argument)
{
var args = [];
if (this.flags & vimperator.Mappings.flags.MOTION)
args.push(motion);
if (this.flags & vimperator.Mappings.flags.COUNT)
args.push(count);
if (this.flags & vimperator.Mappings.flags.ARGUMENT)
args.push(argument);
return this.action.apply(this, args);
}
};
//}}}
vimperator.Mappings = function () //{{{
{
////////////////////////////////////////////////////////////////////////////////
////////////////////// PRIVATE SECTION /////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
var main = []; // default mappings
var user = []; // user created mappings
for (var mode in vimperator.modes)
{
main[mode] = [];
user[mode] = [];
}
function addDefaultMap(map)
{
map.modes.forEach(function (mode) { main[mode].push(map); });
}
function addMap(map, userMap)
{
var where = userMap ? user : main;
map.modes.forEach(function (mode) { where[mode].push(map); });
}
function getMap(mode, cmd, stack)
{
var maps = stack[mode];
for (var i = 0; i < maps.length; i++)
{
if (maps[i].hasName(cmd))
return maps[i];
}
return null;
}
function removeMap(mode, cmd)
{
var maps = user[mode];
var names;
for (var i = 0; i < maps.length; i++)
{
names = maps[i].names;
for (var j = 0; j < names.length; j++)
{
if (names[j] == cmd)
{
names.splice(j, 1);
if (names.length == 0)
maps.splice(i, 1);
return;
}
}
}
}
function mappingsIterator(modes, stack)
{
var output;
var maps = stack[modes[0]];
for (var i = 0; i < maps.length; i++)
{
output = true;
for (var index = 1; index < modes.length; index++) // check other modes
{
output = false; // toggle false, only true whan also found in this mode
for (var z = 0; z < user[modes[index]].length; z++) // maps
{
// NOTE: when other than user maps, there might be more than only one names[x].
// since only user mappings gets queried here, only names[0] gets checked for equality.
if (maps[i].rhs == user[modes[index]][z].rhs && maps[i].names[0] == user[modes[index]][z].names[0])
{
output = true;
break; // found on this mode - check next mode, if there is one, where it could still fail...
}
}
break; // not found in this mode -> map wont' match all modes...
}
if (output)
yield maps[i];
}
throw StopIteration;
}
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// PUBLIC SECTION //////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
// FIXME:
vimperator.Mappings.flags = {
ALLOW_EVENT_ROUTING: 1 << 0, // if set, return true inside the map command to pass the event further to firefox
MOTION: 1 << 1,
COUNT: 1 << 2,
ARGUMENT: 1 << 3
};
var mappingManager = {
// NOTE: just normal mode for now
__iterator__: 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);
},
hasMap: function (mode, cmd)
{
return user[mode].some(function (map) { return map.hasName(cmd); });
},
addDefault: function (modes, keys, description, action, extra)
{
addMap (new vimperator.Map([vimperator.modes.NORMAL], keys,
action, { shortHelp: description }), false);
},
add: function (map)
{
// a map can have multiple names
for (var i = 0; i < map.names.length; i++)
{
// only store keysyms with uppercase modifier strings
map.names[i] = map.names[i].replace(/[casm]-/g, function (name) { return name.toUpperCase(); });
for (var j = 0; j < map.modes.length; j++)
removeMap(map.modes[j], map.names[i]);
}
// all maps got removed (matching names = lhs), and added newly here
for (var k = 0; k < map.modes.length; k++)
user[map.modes[k]].push(map);
},
remove: function (mode, cmd)
{
removeMap(mode, cmd);
},
removeAll: function (mode)
{
user[mode] = [];
},
get: function (mode, cmd)
{
return getMap(mode, cmd, user) || getMap(mode, cmd, main);
},
getDefault: function (mode, cmd)
{
return getMap(mode, cmd, main);
},
// returns an array of mappings with names which start with "cmd"
getCandidates: function (mode, cmd)
{
var mappings = user[mode].concat(main[mode]);
var matches = [];
for (var i = 0; i < mappings.length; i++)
{
var map = mappings[i];
for (var j = 0; j < map.names.length; j++)
{
if (map.names[j].indexOf(cmd) == 0)
{
// for < only return a candidate if it doesn't look like a <c-x> mapping
if (cmd != "<" || !/^<.+>/.test(map.names[j]))
matches.push(map);
}
}
}
return matches;
},
list: function (modes, filter)
{
// modes means, a map must exist in both modes in order to get listed
var maps = user[modes[0]]; // duplicate (reference) (first mode where it must match)
var output = [];
if (!maps || maps.length == 0)
{
vimperator.echo("No mappings found");
return;
}
for (var i = 0; i < maps.length; i++) // check on maps items (first mode)
{
output.push(true);
if (filter && maps[i].names[0] != filter) // does it match the filter first of all?
{
output[output.length - 1] = false;
continue;
}
for (var index = 1; index < modes.length; index++) // check if found in the other modes (1(2nd)-last)
{
output[output.length - 1] = false; // toggle false, only true whan also found in this mode
for (var z = 0; z < user[modes[index]].length; z++) // maps on the other modes
{
// NOTE: when other than user maps, there might be more than only one names[x].
// since only user mappings gets queried here, only names[0] gets checked for equality.
if (maps[i].rhs == user[modes[index]][z].rhs && maps[i].names[0] == user[modes[index]][z].names[0])
{
output[output.length - 1] = true;
break; // found on this mode - ok, check next mode...
}
}
break; // not found in this mode -> map wont' match all modes...
}
}
// anything found?
var flag = false;
for (var i = 0; i < output.length; i++)
if (output[i])
flag = true;
if (!flag)
{
vimperator.echo("No mappings found");
return;
}
var modeSign = "";
for (var i = 0; i < modes.length; i++)
{
if (modes[i] == vimperator.modes.NORMAL)
modeSign += 'n';
if ((modes[i] == vimperator.modes.INSERT || modes[i] == vimperator.modes.TEXTAREA) && modeSign.indexOf("i") == -1)
modeSign += 'i';
if (modes[i] == vimperator.modes.COMMAND_LINE)
modeSign += 'c';
}
var list = "<table>";
for (i = 0; i < maps.length; i++)
{
if (!output[i])
continue;
for (var j = 0; j < maps[i].names.length; j++)
{
list += "<tr>";
list += "<td> " + modeSign + " " + vimperator.util.escapeHTML(maps[i].names[j]) + "</td>";
if (maps[i].rhs)
list += "<td> "+ (maps[i].noremap ? "*" : " ") + "</td>"
+ "<td>" + vimperator.util.escapeHTML(maps[i].rhs) + "</td>";
list += "</tr>";
}
}
list += "</table>";
vimperator.commandline.echo(list, vimperator.commandline.HL_NORMAL, vimperator.commandline.FORCE_MULTILINE);
}
};
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// DEFAULT MAPPINGS ////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
var allModes = [vimperator.modes.NONE,
vimperator.modes.NORMAL,
vimperator.modes.INSERT,
vimperator.modes.VISUAL,
vimperator.modes.HINTS,
vimperator.modes.COMMAND_LINE,
vimperator.modes.CARET,
vimperator.modes.TEXTAREA];
var noninsertModes = [vimperator.modes.NORMAL,
vimperator.modes.VISUAL,
vimperator.modes.HINTS,
vimperator.modes.CARET,
vimperator.modes.TEXTAREA];
//
// NORMAL mode
// {{{
// vimperator management
addDefaultMap(new vimperator.Map(allModes, ["<F1>"],
function () { vimperator.commands.help(); },
{ shortHelp: "Open help window" }
));
addDefaultMap(new vimperator.Map(allModes, ["<Esc>", "<C-[>"],
vimperator.events.onEscape,
{ shortHelp: "Focus content" }
));
addDefaultMap(new vimperator.Map(noninsertModes, [":"],
function () { vimperator.commandline.open(":", "", vimperator.modes.EX); },
{ shortHelp: "Start command line mode" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL, vimperator.modes.VISUAL, vimperator.modes.CARET], ["<Tab>"],
function () { document.commandDispatcher.advanceFocus(); },
{ shortHelp: "Advance keyboard focus" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL, vimperator.modes.VISUAL, vimperator.modes.CARET, vimperator.modes.INSERT, vimperator.modes.TEXTAREA], ["<S-Tab>"],
function () { document.commandDispatcher.rewindFocus(); },
{ shortHelp: "Rewind keyboard focus" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["i", "<Insert>"],
function ()
{
// setting this option triggers an observer
// which takes care of the mode setting
vimperator.options.setFirefoxPref("accessibility.browsewithcaret", true);
},
{ shortHelp: "Start caret mode" }
));
addDefaultMap(new vimperator.Map(allModes, ["<C-q>"],
function () { vimperator.modes.passAllKeys = true; },
{ shortHelp: "Temporarily quit Vimperator mode" }
));
addDefaultMap(new vimperator.Map(allModes, ["<C-v>"],
function () { vimperator.modes.passNextKey = true; },
{ shortHelp: "Pass through next key" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["<C-c>"],
BrowserStop,
{ shortHelp: "Stop loading" }
));
addDefaultMap(new vimperator.Map(allModes, ["<Nop>"],
function () { return; },
{ shortHelp: "Do nothing" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["]f"],
function (count) { vimperator.buffer.shiftFrameFocus(count > 1 ? count : 1, true); },
{
shortHelp: "Focus next frame",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["[f"],
function (count) { vimperator.buffer.shiftFrameFocus(count > 1 ? count : 1, false); },
{
shortHelp: "Focus previous frame",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["]]"],
function (count) { vimperator.buffer.followDocumentRelationship("next"); },
{
shortHelp: "Follow a link labeled to 'next' or '>' if it exists",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["[["],
function (count) { vimperator.buffer.followDocumentRelationship("previous"); },
{
shortHelp: "Follow a link labeled to 'prev', 'previous' or '<' if it exists",
flags: vimperator.Mappings.flags.COUNT
}
));
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" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["b"],
function () { vimperator.commandline.open(":", "buffer! ", vimperator.modes.EX); },
{ shortHelp: "Open a prompt to switch buffers" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["B"],
function () { vimperator.buffer.list(true); },
{ shortHelp: "Toggle buffer list" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["gb"],
function (count) { vimperator.buffer.switchTo(null, null, count, false); },
{
shortHelp: "Repeat last :buffer[!] command",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["gB"],
function (count) { vimperator.buffer.switchTo(null, null, count, true); },
{
shortHelp: "Repeat last :buffer[!] command in reverse direction",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["d"],
function (count) { vimperator.tabs.remove(getBrowser().mCurrentTab, count, false, 0); },
{
shortHelp: "Delete current buffer (=tab)",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["D"],
function (count) { vimperator.tabs.remove(getBrowser().mCurrentTab, count, true, 0); },
{
shortHelp: "Delete current buffer (=tab)",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["~"],
function () { vimperator.open("~"); },
{ shortHelp: "Open home directory" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["gf"],
function () { vimperator.commands.viewsource(); },
{ shortHelp: "View source" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["gF"],
function () { vimperator.commands.viewsource(null, true); },
{ shortHelp: "View source with an external editor" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["gh"],
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], ["gi"],
function ()
{
if (vimperator.buffer.lastInputField)
vimperator.buffer.lastInputField.focus();
else
{
var first = vimperator.buffer.evaluateXPath(
"//*[@type='text'] | //textarea | //xhtml:textarea").snapshotItem(0);
if (first)
first.focus();
else
vimperator.beep();
}
},
{ shortHelp: "Focus last used input field" }
));
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], ["gP"],
function ()
{
vimperator.open(readFromClipboard(),
/\bpaste\b/.test(vimperator.options["activate"]) ?
vimperator.NEW_BACKGROUND_TAB : vimperator.NEW_TAB);
},
{ shortHelp: "Open (put) a URL based on the current clipboard contents in a new buffer" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["g0", "g^"],
function (count) { vimperator.tabs.select(0); },
{ shortHelp: "Go to the first tab" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["g$"],
function (count) { vimperator.tabs.select("$"); },
{ shortHelp: "Go to the last tab" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["gt", "<C-n>", "<C-Tab>", "<C-PageDown>"],
function (count) { vimperator.tabs.select(count > 0 ? count - 1: "+1", count > 0 ? false : true); },
{
shortHelp: "Go to the next tab",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["gT", "<C-p>", "<C-S-Tab>", "<C-PageUp>"],
function (count) { vimperator.tabs.select("-" + (count < 1 ? 1 : count), true); },
{
shortHelp: "Go {count} pages back",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["<C-^>", "<C-6>"],
function ()
{
if (vimperator.tabs.alternate == null || vimperator.tabs.getTab() == vimperator.tabs.alternate)
{
vimperator.echoerr("E23: No alternate page");
return;
}
// NOTE: this currently relies on v.tabs.index() returning the
// currently selected tab index when passed null
var index = vimperator.tabs.index(vimperator.tabs.alternate);
// TODO: since a tab close is more like a bdelete for us we
// should probably reopen the closed tab when a 'deleted'
// alternate is selected
if (index == -1)
vimperator.echoerr("E86: Buffer does not exist"); // TODO: This should read "Buffer N does not exist"
else
vimperator.tabs.select(index);
},
{ shortHelp: "Select the alternate tab" }
));
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
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["'", "`"],
function (arg) { vimperator.marks.jumpTo(arg); },
{
shortHelp: "Jump to the mark in the current buffer",
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
}
));
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], ["p", "<MiddleMouse>"],
function () { vimperator.open(readFromClipboard()); },
{ shortHelp: "Open (put) a URL based on the current clipboard contents in the current buffer" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["P"],
function ()
{
vimperator.open(readFromClipboard(),
/\bpaste\b/.test(vimperator.options["activate"]) ?
vimperator.NEW_TAB : vimperator.NEW_BACKGROUND_TAB);
},
{ shortHelp: "Open (put) a URL based on the current clipboard contents in a new buffer" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["<C-l>"],
function (count) { vimperator.commands.redraw(); },
{
shortHelp: "Redraw the screen",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["r"],
function () { vimperator.tabs.reload(getBrowser().mCurrentTab, false); },
{ shortHelp: "Reload current page" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["R"],
function () { vimperator.tabs.reload(getBrowser().mCurrentTab, true); },
{ shortHelp: "Reload while skipping the cache" }
));
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], ["u"],
function (count) { vimperator.commands.undo("", false, count); },
{
shortHelp: "Undo closing of a tab",
flags: vimperator.Mappings.flags.COUNT
}
));
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" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["zi", "+"],
function (count) { vimperator.buffer.zoomIn(count > 1 ? count : 1, false); },
{
shortHelp: "Enlarge text zoom of current web page",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["zm"],
function (count) { vimperator.buffer.zoomIn((count > 1 ? count : 1) * 3, false); },
{
shortHelp: "Enlarge text zoom of current web page by a larger amount",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["zo", "-"],
function (count) { vimperator.buffer.zoomOut(count > 1 ? count : 1, false); },
{
shortHelp: "Reduce text zoom of current web page",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["zr"],
function (count) { vimperator.buffer.zoomOut((count > 1 ? count : 1) * 3, false); },
{
shortHelp: "Reduce text zoom of current web page by a larger amount",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["zz"],
function (count) { vimperator.buffer.textZoom = count > 1 ? count : 100; },
{
shortHelp: "Set text zoom value of current web page",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["zI"],
function (count) { vimperator.buffer.zoomIn(count > 1 ? count : 1, true); },
{
shortHelp: "Enlarge full zoom of current web page",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["zM"],
function (count) { vimperator.buffer.zoomIn((count > 1 ? count : 1) * 3, true); },
{
shortHelp: "Enlarge full zoom of current web page by a larger amount",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["zO"],
function (count) { vimperator.buffer.zoomOut(count > 1 ? count : 1, true); },
{
shortHelp: "Reduce full zoom of current web page",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["zR"],
function (count) { vimperator.buffer.zoomOut((count > 1 ? count : 1) * 3, true); },
{
shortHelp: "Reduce full zoom of current web page by a larger amount",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["zZ"],
function (count) { vimperator.buffer.fullZoom = count > 1 ? count : 100; },
{
shortHelp: "Set full zoom value of current web page",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["ZQ"],
function () { vimperator.quit(false); },
{ shortHelp: "Quit and don't save the session" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["ZZ"],
function () { vimperator.quit(true); },
{ shortHelp: "Quit and save the session" }
));
function incrementURL(count)
{
var url = vimperator.buffer.URL;
var regex = /(.*?)(-?\d+)(\D*)$/;
var matches = url.match(regex);
if (!matches || !matches[2]) // no number to increment
{
vimperator.beep();
return;
}
var newNum = parseInt(matches[2], 10) + count + ""; // "" to make sure its a string
var nums = newNum.match(/^(-?)(\d+)$/);
var oldLength = matches[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(matches[1] + newNum + matches[3]);
}
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["<C-x>"],
function (count) { incrementURL(-(count > 1 ? count : 1)); },
{
shortHelp: "Decrement last number in URL",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["<C-a>"],
function (count) { incrementURL(count > 1 ? count : 1); },
{
shortHelp: "Increment last number in URL",
flags: vimperator.Mappings.flags.COUNT
}
));
// scrolling commands
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["0", "^"],
function () { vimperator.buffer.scrollStart(); },
{ shortHelp: "Scroll to the absolute left of the document" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["$"],
function () { vimperator.buffer.scrollEnd(); },
{ shortHelp: "Scroll to the absolute right of the document" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["gg", "<Home>"],
function (count) { vimperator.buffer.scrollToPercentile(count > 0 ? count : 0); },
{
shortHelp: "Goto the top of the document",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["G", "<End>"],
function (count) { vimperator.buffer.scrollToPercentile(count >= 0 ? count : 100); },
{
shortHelp: "Goto the end of the document",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["h", "<Left>"],
function (count) { vimperator.buffer.scrollColumns(-(count > 1 ? count : 1)); },
{
shortHelp: "Scroll document to the left",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["j", "<Down>", "<C-e>"],
function (count) { vimperator.buffer.scrollLines(count > 1 ? count : 1); },
{
shortHelp: "Scroll document down",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["k", "<Up>", "<C-y>"],
function (count) { vimperator.buffer.scrollLines(-(count > 1 ? count : 1)); },
{
shortHelp: "Scroll document up",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["<C-d>"],
function (count) { vimperator.buffer.scrollByScrollSize(count, 1); },
{
shortHelp: "Scroll window downwards in the buffer",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["<C-u>"],
function (count) { vimperator.buffer.scrollByScrollSize(count, -1); },
{
shortHelp: "Scroll window upwards in the buffer",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["l", "<Right>"],
function (count) { vimperator.buffer.scrollColumns(count > 1 ? count : 1); },
{
shortHelp: "Scroll document to the right",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["<C-b>", "<PageUp>", "<S-Space>"],
function (count) { vimperator.buffer.scrollPages(-(count > 1 ? count : 1)); },
{
shortHelp: "Scroll up a full page",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["<C-f>", "<PageDown>", "<Space>"],
function (count) { vimperator.buffer.scrollPages(count > 1 ? count : 1); },
{
shortHelp: "Scroll down a full page",
flags: vimperator.Mappings.flags.COUNT
}
));
// page info
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["<C-g>"],
function (count) { vimperator.buffer.showPageInfo(false); },
{
shortHelp: "Print the current file name",
flags: vimperator.Mappings.flags.COUNT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["g<C-g>"],
function (count) { vimperator.buffer.showPageInfo(true); },
{ shortHelp: "Print file information" }
));
// history manipulation and jumplist
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
}
));
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" }
));
// hint managment
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["f"],
function () { vimperator.hints.show(vimperator.modes.QUICK_HINT); },
{ shortHelp: "Start QuickHint mode" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["F"],
function () { vimperator.hints.show(vimperator.modes.QUICK_HINT, "t"); },
{ shortHelp: "Start QuickHint mode, but open link in a new tab" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], [";"],
function (arg)
{
if (arg == "f")
vimperator.hints.show(vimperator.modes.ALWAYS_HINT, "o");
else if (arg == "F")
vimperator.hints.show(vimperator.modes.ALWAYS_HINT, "t");
else
vimperator.hints.show(vimperator.modes.EXTENDED_HINT, arg);
},
{
shortHelp: "Start an extended hint mode",
flags: vimperator.Mappings.flags.ARGUMENT
}
));
// search management
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["/"],
function () { vimperator.search.openSearchDialog(vimperator.modes.SEARCH_FORWARD); },
{ shortHelp: "Search forward for a pattern" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["?"],
function () { vimperator.search.openSearchDialog(vimperator.modes.SEARCH_BACKWARD); },
{ shortHelp: "Search backwards for a pattern" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["n"],
function () { vimperator.search.findAgain(false); },
{ shortHelp: "Find next" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["N"],
function () { vimperator.search.findAgain(true); },
{ shortHelp: "Find previous" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["q"],
function (arg) { vimperator.events.startRecording(arg); },
{
shortHelp: "Record a keysequence into a macro",
flags: vimperator.Mappings.flags.ARGUMENT
}
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL], ["@"],
function (count, arg)
{
if (count < 1) count = 1;
while (count--)
vimperator.events.playMacro(arg);
},
{
shortHelp: "Play a macro",
flags: vimperator.Mappings.flags.ARGUMENT | vimperator.Mappings.flags.COUNT
}
));
// }}}
// CARET mode
// {{{
function getSelectionController()
{
return getBrowser().docShell
.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsISelectionDisplay)
.QueryInterface(Components.interfaces.nsISelectionController);
}
addDefaultMap(new vimperator.Map([vimperator.modes.CARET, vimperator.modes.TEXTAREA], ["v"],
function (count) { vimperator.modes.set(vimperator.modes.VISUAL, vimperator.mode); },
{ shortHelp: "Start visual mode" }
));
addDefaultMap(new vimperator.Map([vimperator.modes.CARET], ["j", "<Down>"],
function (count)
{
if (count < 1) count = 1;
while (count--)
getSelectionController().lineMove(true, false);
},
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.CARET], ["k", "<Up>"],
function (count)
{
if (count < 1) count = 1;
while (count--)
getSelectionController().lineMove(false, false);
},
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.CARET], ["h", "<Left>"],
function (count)
{
if (count < 1) count = 1;
while (count--)
getSelectionController().characterMove(false, false);
},
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.CARET], ["l", "<Right>"],
function (count)
{
if (count < 1) count = 1;
while (count--)
getSelectionController().characterMove(true, false);
},
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.CARET], ["b", "B", "<C-Left>"],
function (count)
{
if (count < 1) count = 1;
while (count--)
getSelectionController().wordMove(false, false);
},
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.CARET], ["w", "W", "e", "<C-Right>"],
function (count)
{
if (count < 1) count = 1;
while (count--)
getSelectionController().wordMove(true, false);
},
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.CARET], ["<C-f>", "<PageDown>"],
function (count)
{
if (count < 1) count = 1;
while (count--)
getSelectionController().pageMove(true, false);
},
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.CARET], ["<C-b>", "<PageUp>"],
function (count)
{
if (count < 1) count = 1;
while (count--)
getSelectionController().pageMove(false, false);
},
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.CARET], ["gg", "<C-Home>"],
function (count) { getSelectionController().completeMove(false, false); },
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.CARET], ["G", "<C-End>"],
function (count) { getSelectionController().completeMove(true, false); },
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.CARET], ["0", "^", "<Home>"],
function (count) { getSelectionController().intraLineMove(false, false); },
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.CARET], ["$", "<End>"],
function (count) { getSelectionController().intraLineMove(true, false); },
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL, vimperator.modes.CARET, vimperator.modes.TEXTAREA], ["*"],
function (count)
{
vimperator.search.searchSubmitted(vimperator.buffer.getCurrentWord(), false);
vimperator.search.findAgain();
},
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.NORMAL, vimperator.modes.CARET, vimperator.modes.TEXTAREA], ["#"],
function (count)
{
vimperator.search.searchSubmitted(vimperator.buffer.getCurrentWord(), true);
vimperator.search.findAgain();
},
{ }
));
// }}}
// VISUAL mode
// {{{
addDefaultMap(new vimperator.Map([vimperator.modes.VISUAL], ["j", "<Down>"],
function (count)
{
if (count < 1) count = 1;
while (count--)
{
if (vimperator.modes.extended & vimperator.modes.TEXTAREA)
{
vimperator.editor.executeCommand("cmd_selectLineNext");
if ((vimperator.modes.extended & vimperator.modes.LINE) && !vimperator.editor.selectedText())
vimperator.editor.executeCommand("cmd_selectLineNext");
}
else
getSelectionController().lineMove(true, true);
}
},
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.VISUAL], ["k", "<Up>"],
function (count)
{
if (count < 1) count = 1;
while (count--)
{
if (vimperator.modes.extended & vimperator.modes.TEXTAREA)
{
vimperator.editor.executeCommand("cmd_selectLinePrevious");
if ((vimperator.modes.extended & vimperator.modes.LINE) && !vimperator.editor.selectedText())
vimperator.editor.executeCommand("cmd_selectLinePrevious");
}
else
getSelectionController().lineMove(false, true);
}
},
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.VISUAL], ["h", "<Left>"],
function (count)
{
if (count < 1) count = 1;
while (count--)
{
if (vimperator.modes.extended & vimperator.modes.TEXTAREA)
vimperator.editor.executeCommand("cmd_selectCharPrevious");
else
getSelectionController().characterMove(false, true);
}
},
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.VISUAL], ["l", "<Right>"],
function (count)
{
if (count < 1) count = 1;
while (count--)
{
if (vimperator.modes.extended & vimperator.modes.TEXTAREA)
vimperator.editor.executeCommand("cmd_selectCharNext");
else
getSelectionController().characterMove(true, true);
}
},
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.VISUAL], ["b", "B"],
function (count)
{
if (count < 1) count = 1;
while (count--)
{
if (vimperator.modes.extended & vimperator.modes.TEXTAREA)
vimperator.editor.executeCommand("cmd_selectWordPrevious");
else
getSelectionController().wordMove(false, true);
}
},
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.VISUAL], ["w", "W", "e"],
function (count)
{
if (count < 1) count = 1;
while (count--)
{
if (vimperator.modes.extended & vimperator.modes.TEXTAREA)
vimperator.editor.executeCommand("cmd_selectWordNext");
else
getSelectionController().wordMove(true, true);
}
},
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.VISUAL], ["<C-f>", "<PageDown>"],
function (count)
{
if (count < 1) count = 1;
while (count--)
{
if (vimperator.modes.extended & vimperator.modes.TEXTAREA)
;//vimperator.editor.executeCommand("cmd_selectPageNext");
else
getSelectionController().pageMove(true, true);
}
},
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.VISUAL], ["<C-b>", "<PageUp>"],
function (count)
{
if (count < 1) count = 1;
while (count--)
{
if (vimperator.modes.extended & vimperator.modes.TEXTAREA)
;//vimperator.editor.executeCommand("cmd_selectWordNext");
else
getSelectionController().pageMove(false, true);
}
},
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.VISUAL], ["gg", "<C-Home>"],
function (count)
{
if (vimperator.modes.extended & vimperator.modes.TEXTAREA)
vimperator.editor.executeCommand("cmd_selectTop");
else
getSelectionController().completeMove(false, true);
},
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.VISUAL], ["G", "<C-End>"],
function (count)
{
if (vimperator.modes.extended & vimperator.modes.TEXTAREA)
vimperator.editor.executeCommand("cmd_selectBottom");
else
getSelectionController().completeMove(true, true);
},
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.VISUAL], ["0", "^", "<Home>"],
function (count)
{
if (vimperator.modes.extended & vimperator.modes.TEXTAREA)
vimperator.editor.executeCommand("cmd_selectBeginLine");
else
getSelectionController().intraLineMove(false, true);
},
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.VISUAL], ["$", "<End>"],
function (count)
{
if (vimperator.modes.extended & vimperator.modes.TEXTAREA)
vimperator.editor.executeCommand("cmd_selectEndLine");
else
getSelectionController().intraLineMove(true, true);
},
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.VISUAL], ["c", "s"],
function (count)
{
if (vimperator.modes.extended & vimperator.modes.TEXTAREA)
{
vimperator.editor.executeCommand("cmd_cut");
vimperator.modes.set(vimperator.modes.INSERT, vimperator.modes.TEXTAREA);
}
else
vimperator.beep();
},
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.VISUAL], ["d"],
function (count)
{
if (vimperator.modes.extended & vimperator.modes.TEXTAREA)
{
vimperator.editor.executeCommand("cmd_cut");
vimperator.modes.set(vimperator.modes.TEXTAREA);
}
else
vimperator.beep();
},
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.VISUAL], ["y"],
function (count)
{
if (vimperator.modes.extended & vimperator.modes.TEXTAREA)
{
vimperator.editor.executeCommand("cmd_copy");
// vimperator.editor.unselectText();
vimperator.modes.set(vimperator.modes.TEXTAREA);
}
else
{
var sel = window.content.document.getSelection();
if (sel)
vimperator.copyToClipboard(sel, true);
else
vimperator.beep();
}
},
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.VISUAL, vimperator.modes.TEXTAREA], ["p"],
function (count)
{
if (!(vimperator.modes.extended & vimperator.modes.CARET))
{
if (!count) count = 1;
while (count--)
vimperator.editor.executeCommand("cmd_paste");
vimperator.mode = vimperator.modes.TEXTAREA;
}
else
vimperator.beep();
},
{ }
));
// }}}
// TEXTAREA mode
// {{{
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["i", "<Insert>"],
function (count) { vimperator.modes.set(vimperator.modes.INSERT, vimperator.modes.TEXTAREA); },
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["a"],
function (count)
{
vimperator.editor.executeCommand("cmd_charNext", 1);
vimperator.modes.set(vimperator.modes.INSERT, vimperator.modes.TEXTAREA);
},
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["I", "gI"],
function (count)
{
vimperator.editor.executeCommand("cmd_beginLine", 1);
vimperator.modes.set(vimperator.modes.INSERT, vimperator.modes.TEXTAREA);
},
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["A"],
function (count)
{
vimperator.editor.executeCommand("cmd_endLine", 1);
vimperator.modes.set(vimperator.modes.INSERT, vimperator.modes.TEXTAREA);
},
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["s"],
function (count)
{
vimperator.editor.executeCommand("cmd_deleteCharForward", 1);
vimperator.modes.set(vimperator.modes.INSERT, vimperator.modes.TEXTAREA);
},
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["S"],
function (count)
{
vimperator.editor.executeCommand("cmd_deleteToEndOfLine", 1);
vimperator.editor.executeCommand("cmd_deleteToBeginningOfLine", 1);
vimperator.modes.set(vimperator.modes.INSERT, vimperator.modes.TEXTAREA);
},
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["C"],
function (count)
{
vimperator.editor.executeCommand("cmd_deleteToEndOfLine", 1);
vimperator.modes.set(vimperator.modes.INSERT, vimperator.modes.TEXTAREA);
},
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["v"],
function (count) { vimperator.modes.set(vimperator.modes.VISUAL, vimperator.modes.TEXTAREA); },
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["V"],
function (count)
{
vimperator.modes.set(vimperator.modes.VISUAL, vimperator.modes.TEXTAREA | vimperator.modes.LINE);
vimperator.editor.executeCommand("cmd_beginLine", 1);
vimperator.editor.executeCommand("cmd_selectLineNext", 1);
},
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["u"],
function (count) { vimperator.editor.executeCommand("cmd_undo", count); vimperator.mode = vimperator.modes.TEXTAREA; },
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["<C-r>"],
function (count) { vimperator.editor.executeCommand("cmd_redo", count); vimperator.mode = vimperator.modes.TEXTAREA; },
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["j", "<Down>", "<Return>"],
function (count) { vimperator.editor.executeCommand("cmd_lineNext", count); },
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["k", "<Up>"],
function (count) { vimperator.editor.executeCommand("cmd_linePrevious", count); },
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["h", "<Left>", "<BS>"],
function (count) { vimperator.editor.executeCommand("cmd_charPrevious", count); },
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["l", "<Right>", "<Space>"],
function (count) { vimperator.editor.executeCommand("cmd_charNext", count); },
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["w", "W", "e", "<C-Right>"],
function (count) { vimperator.editor.executeCommand("cmd_wordNext", count); },
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["b", "B", "<C-Left>"],
function (count) { vimperator.editor.executeCommand("cmd_wordPrevious", 1); },
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["gg", "<C-Home>"],
function (count) { vimperator.editor.executeCommand("cmd_moveTop", 1); },
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["G", "<C-End>"],
function (count) { vimperator.editor.executeCommand("cmd_moveBottom", 1); },
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["0", "^", "<Home>"],
function (count) { vimperator.editor.executeCommand("cmd_beginLine", 1); },
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["$", "<End>"],
function (count) { vimperator.editor.executeCommand("cmd_endLine", 1); },
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["<C-f>", "<PageDown>"],
function (count) { vimperator.editor.executeCommand("cmd_movePageDown", count); },
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["<C-b>", "<PageUp>"],
function (count) { vimperator.editor.executeCommand("cmd_movePageUp", count); },
{ flags: vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["o"],
function (count)
{
vimperator.editor.executeCommand("cmd_endLine", 1);
vimperator.modes.set(vimperator.modes.INSERT, vimperator.modes.TEXTAREA);
vimperator.events.feedkeys("<Return>");
},
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["O"],
function (count)
{
vimperator.editor.executeCommand("cmd_beginLine", 1);
vimperator.modes.set(vimperator.modes.INSERT, vimperator.modes.TEXTAREA);
vimperator.events.feedkeys("<Return>");
vimperator.editor.executeCommand("cmd_linePrevious", 1);
},
{ }
));
// no need to check if we are really in TEXTAREA mode, as findCharForward/Backward will return -1 otherwise
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA, vimperator.modes.VISUAL], ["f"],
function (count, arg)
{
var pos = vimperator.editor.findCharForward(arg, count);
if (pos >= 0)
vimperator.editor.moveToPosition(pos, true, vimperator.mode == vimperator.modes.VISUAL);
},
{ flags: vimperator.Mappings.flags.ARGUMENT | vimperator.Mappings.flags.COUNT}
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA, vimperator.modes.VISUAL], ["F"],
function (count, arg)
{
var pos = vimperator.editor.findCharBackward(arg, count);
if (pos >= 0)
vimperator.editor.moveToPosition(pos, false, vimperator.mode == vimperator.modes.VISUAL);
},
{ flags: vimperator.Mappings.flags.ARGUMENT | vimperator.Mappings.flags.COUNT}
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA, vimperator.modes.VISUAL], ["t"],
function (count, arg)
{
var pos = vimperator.editor.findCharForward(arg, count);
if (pos >= 0)
vimperator.editor.moveToPosition(pos - 1, true, vimperator.mode = vimperator.modes.VISUAL);
},
{ flags: vimperator.Mappings.flags.ARGUMENT | vimperator.Mappings.flags.COUNT}
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA, vimperator.modes.VISUAL], ["T"],
function (count, arg)
{
var pos = vimperator.editor.findCharBackward(arg, count);
if (pos >= 0)
vimperator.editor.moveToPosition(pos + 1, false, vimperator.mode = vimperator.modes.VISUAL);
},
{ flags: vimperator.Mappings.flags.ARGUMENT | vimperator.Mappings.flags.COUNT}
));
// addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA, vimperator.modes.VISUAL], [";"],
// function (count, arg)
// {
// var pos = vimperator.editor.findCharBackward(null, count);
// if (pos >= 0)
// vimperator.editor.moveToPosition(pos + 1, false, vimperator.mode = vimperator.modes.VISUAL);
// },
// { flags: vimperator.Mappings.flags.ARGUMENT | vimperator.Mappings.flags.COUNT}
// ));
// commands which require a motion
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["d"],
function (motion, count) { vimperator.editor.executeCommandWithMotion("d", motion, count); },
{ flags: vimperator.Mappings.flags.MOTION | vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["c"],
function (motion, count) { vimperator.editor.executeCommandWithMotion("c", motion, count); },
{ flags: vimperator.Mappings.flags.MOTION | vimperator.Mappings.flags.COUNT }
));
addDefaultMap(new vimperator.Map([vimperator.modes.TEXTAREA], ["y"],
function (motion, count) { vimperator.editor.executeCommandWithMotion("y", motion, count); },
{ flags: vimperator.Mappings.flags.MOTION | vimperator.Mappings.flags.COUNT }
));
// }}}
// INSERT mode
// {{{
addDefaultMap(new vimperator.Map([vimperator.modes.INSERT, vimperator.modes.COMMAND_LINE], ["<C-w>"],
function () { vimperator.editor.executeCommand("cmd_deleteWordBackward", 1); },
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.INSERT, vimperator.modes.COMMAND_LINE], ["<C-u>"],
function ()
{
// broken in FF3, deletes the whole line:
// vimperator.editor.executeCommand("cmd_deleteToBeginningOfLine", 1);
vimperator.editor.executeCommand("cmd_selectBeginLine", 1);
vimperator.editor.executeCommand("cmd_delete", 1);
},
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.INSERT, vimperator.modes.COMMAND_LINE], ["<C-k>"],
function () { vimperator.editor.executeCommand("cmd_deleteToEndOfLine", 1); },
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.INSERT, vimperator.modes.COMMAND_LINE], ["<C-a>", "<Home>"],
function () { vimperator.editor.executeCommand("cmd_beginLine", 1); },
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.INSERT, vimperator.modes.COMMAND_LINE], ["<C-e>", "<End>"],
function () { vimperator.editor.executeCommand("cmd_endLine", 1); },
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.INSERT, vimperator.modes.COMMAND_LINE], ["<C-h>"], // let firefox handle <BS>
function () { vimperator.editor.executeCommand("cmd_deleteCharBackward", 1); },
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.INSERT, vimperator.modes.COMMAND_LINE], ["<C-d>"],
function () { vimperator.editor.executeCommand("cmd_deleteCharForward", 1); },
{ }
));
// addDefaultMap(new vimperator.Map([vimperator.modes.INSERT, vimperator.modes.COMMAND_LINE], ["<C-b>"],
// function () { vimperator.editor.executeCommand("cmd_charPrevious", 1); },
// { }
// ));
// addDefaultMap(new vimperator.Map([vimperator.modes.INSERT, vimperator.modes.COMMAND_LINE], ["<C-f>"],
// function () { vimperator.editor.executeCommand("cmd_charNext", 1); },
// { }
// ));
addDefaultMap(new vimperator.Map([vimperator.modes.INSERT, vimperator.modes.COMMAND_LINE], ["<S-Insert>"],
function () { vimperator.editor.pasteClipboard(); },
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.INSERT, vimperator.modes.TEXTAREA], ["<C-i>"],
function () { vimperator.editor.editWithExternalEditor(); },
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.INSERT, vimperator.modes.TEXTAREA], ["<Space>", "<Return>"],
function () { return vimperator.editor.expandAbbreviation("i"); },
{ flags: vimperator.Mappings.flags.ALLOW_EVENT_ROUTING }
));
addDefaultMap(new vimperator.Map([vimperator.modes.INSERT, vimperator.modes.TEXTAREA], ["<Tab>"],
function () { vimperator.editor.expandAbbreviation("i"); document.commandDispatcher.advanceFocus(); },
{ }
));
addDefaultMap(new vimperator.Map([vimperator.modes.INSERT, vimperator.modes.TEXTAREA],
["<C-]>", "<C-5>"], function () { vimperator.editor.expandAbbreviation("i"); }, { }
));
//}}}
// COMMAND_LINE mode
//{{{
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;
}; //}}}
// vim: set fdm=marker sw=4 ts=4 et: