summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Kearns <dougkearns@gmail.com>2009-03-16 15:54:02 +1100
committerDoug Kearns <dougkearns@gmail.com>2009-03-16 15:54:02 +1100
commit80beaa41df9ef3d6e62ecb189451146cb52eb21d (patch)
tree449b9c1fc45402ae323d2b6fab55eafc2ecec607
parent9f70457a4a51c25b9942dcf63942c0341029b636 (diff)
downloadpentadactyl-80beaa41df9ef3d6e62ecb189451146cb52eb21d.tar.gz
And xulmus was born.
-rw-r--r--License.txt1
-rw-r--r--Makefile2
-rw-r--r--common/Makefile.common4
-rw-r--r--common/content/buffer.js21
-rw-r--r--common/content/completion.js10
-rw-r--r--common/content/events.js35
-rw-r--r--common/content/liberator.js12
-rw-r--r--common/content/modes.js1
-rw-r--r--common/content/services.js4
-rw-r--r--common/content/tabs.js29
-rw-r--r--common/content/ui.js4
-rw-r--r--common/content/util.js2
-rw-r--r--common/make_jar.sh11
-rw-r--r--common/skin/liberator.css4
-rwxr-xr-xxulmus/Makefile9
-rwxr-xr-xxulmus/NEWS1
-rwxr-xr-xxulmus/chrome.manifest24
-rwxr-xr-xxulmus/components/chrome-data.js87
-rwxr-xr-xxulmus/content/bookmarks.js1146
-rwxr-xr-xxulmus/content/config.js496
-rwxr-xr-xxulmus/content/liberator.dtd6
-rwxr-xr-xxulmus/content/player.js219
-rwxr-xr-xxulmus/content/xulmus.pngbin0 -> 2226 bytes
-rwxr-xr-xxulmus/content/xulmus.svg88
-rwxr-xr-xxulmus/content/xulmus.xul52
-rwxr-xr-xxulmus/contrib/vim/Makefile9
-rwxr-xr-xxulmus/contrib/vim/ftdetect/vimperator.vim1
-rwxr-xr-xxulmus/contrib/vim/mkvimball.txt2
-rwxr-xr-xxulmus/contrib/vim/syntax/vimperator.vim104
-rwxr-xr-xxulmus/install.rdf58
-rwxr-xr-xxulmus/locale/en-US/Makefile2
-rwxr-xr-xxulmus/locale/en-US/asciidoc.conf86
-rwxr-xr-xxulmus/locale/en-US/autocommands.txt91
-rwxr-xr-xxulmus/locale/en-US/browsing.txt349
-rwxr-xr-xxulmus/locale/en-US/buffer.txt361
-rwxr-xr-xxulmus/locale/en-US/cmdline.txt80
-rwxr-xr-xxulmus/locale/en-US/developer.txt88
-rwxr-xr-xxulmus/locale/en-US/eval.txt84
-rwxr-xr-xxulmus/locale/en-US/gui.txt90
-rwxr-xr-xxulmus/locale/en-US/help.js24
-rwxr-xr-xxulmus/locale/en-US/hints.txt67
-rwxr-xr-xxulmus/locale/en-US/index.txt316
-rwxr-xr-xxulmus/locale/en-US/insert.txt30
-rwxr-xr-xxulmus/locale/en-US/intro.txt115
-rwxr-xr-xxulmus/locale/en-US/map.txt413
-rwxr-xr-xxulmus/locale/en-US/marks.txt249
-rwxr-xr-xxulmus/locale/en-US/message.txt22
-rwxr-xr-xxulmus/locale/en-US/options.txt815
-rwxr-xr-xxulmus/locale/en-US/overlay.dtd4
-rwxr-xr-xxulmus/locale/en-US/overlay.properties1
-rwxr-xr-xxulmus/locale/en-US/pattern.txt70
-rwxr-xr-xxulmus/locale/en-US/print.txt34
-rwxr-xr-xxulmus/locale/en-US/repeat.txt145
-rwxr-xr-xxulmus/locale/en-US/starting.txt60
-rwxr-xr-xxulmus/locale/en-US/styling.txt131
-rwxr-xr-xxulmus/locale/en-US/tabs.txt218
-rwxr-xr-xxulmus/locale/en-US/tutorial.txt253
-rwxr-xr-xxulmus/locale/en-US/various.txt111
-rwxr-xr-xxulmus/locale/en-US/xhtml11.css349
-rwxr-xr-xxulmus/skin/icon.pngbin0 -> 514 bytes
-rwxr-xr-xxulmus/vimperatorrc.example21
61 files changed, 7085 insertions, 36 deletions
diff --git a/License.txt b/License.txt
index 7efdb050..d589f3c4 100644
--- a/License.txt
+++ b/License.txt
@@ -11,6 +11,7 @@ for the specific language governing rights and limitations under the
License.
Copyright (c) 2006-2009 by Martin Stubenschrott <stubenschrott@gmx.net>
+Copyright (c) 2009 by Prathyush Thota <prathyush@sun.com>
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
diff --git a/Makefile b/Makefile
index c0c3842b..2b2594b4 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
-DIRS = vimperator muttator
+DIRS = muttator vimperator xulmus
TARGETS = clean distclean doc help info jar release xpi
.SILENT:
diff --git a/common/Makefile.common b/common/Makefile.common
index d0e1210b..0820a039 100644
--- a/common/Makefile.common
+++ b/common/Makefile.common
@@ -9,7 +9,7 @@ LOCALEDIR = locale
DOC_SRC_FILES = $(wildcard $(LOCALEDIR)/*/*.txt)
LOCALES = $(foreach locale,$(wildcard $(LOCALEDIR)/*),$(word 2,$(subst /, ,$(locale))))
-MAKE_JAR = VERSION="$(VERSION)" DATE="$(BUILD_DATE)" sh $(BASE)/make_jar.sh
+MAKE_JAR = VERSION="$(VERSION)" DATE="$(BUILD_DATE)" bash $(BASE)/make_jar.sh
# TODO: specify source files manually?
JAR_BASES = $(TOP) $(BASE)
@@ -45,7 +45,7 @@ TARGETS = all help info doc jar xpi install clean distclean $(JAR)
$(TARGETS:%=\%.%):
echo MAKE $* $(@:$*.%=%)
$(MAKE) -C $* $(@:$*.%=%)
-
+ echo $$SHELL
.PHONY: $(TARGETS)
all: help
diff --git a/common/content/buffer.js b/common/content/buffer.js
index 7f535692..cf406134 100644
--- a/common/content/buffer.js
+++ b/common/content/buffer.js
@@ -42,8 +42,9 @@ function Buffer() //{{{
////////////////////// PRIVATE SECTION /////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
- // FIXME: This doesn't belong here.
- let mainWindowID = config.mainWindowID || "main-window";
+ // FIXME: This doesn't belong here.
+ let mainWindowID = config.mainWindowID || "mainplayer";
+
let fontSize = util.computedStyle(document.getElementById(mainWindowID)).fontSize;
styles.registerSheet("chrome://liberator/skin/liberator.css");
@@ -214,7 +215,13 @@ function Buffer() //{{{
mappings.add(myModes, ["<C-c>"],
"Stop loading",
- function () { window.BrowserStop(); });
+ function ()
+ {
+ if(config.name == "Xulmus")
+ getBrowser().mCurrentBrowser.stop();
+ else
+ window.BrowserStop();
+ });
// scrolling
mappings.add(myModes, ["j", "<Down>", "<C-e>"],
@@ -596,7 +603,13 @@ function Buffer() //{{{
commands.add(["st[op]"],
"Stop loading",
- function () { window.BrowserStop(); },
+ function ()
+ {
+ if(config.name == "Xulmus")
+ getBrowser().mCurrentBrowser.stop();
+ else
+ window.BrowserStop();
+ },
{ argCount: "0" });
commands.add(["vie[wsource]"],
diff --git a/common/content/completion.js b/common/content/completion.js
index 9cd8010a..d06a0497 100644
--- a/common/content/completion.js
+++ b/common/content/completion.js
@@ -1381,6 +1381,16 @@ function Completion() //{{{
completion.urls(context, tags);
},
+ songCompletion: function songCompletion(context, args)
+ {
+ if (args.completeArg == 0)
+ context.completions = getArtists();
+ else if (args.completeArg == 1)
+ context.completions = getAlbums(args[0]);
+ else if (args.completeArg == 2)
+ context.completions = getTracks(args[0],args[1]);
+ },
+
buffer: function buffer(context)
{
filter = context.filter.toLowerCase();
diff --git a/common/content/events.js b/common/content/events.js
index 8d25106d..80d3858b 100644
--- a/common/content/events.js
+++ b/common/content/events.js
@@ -628,7 +628,7 @@ function Events() //{{{
// return true when load successful, or false otherwise
function waitForPageLoaded() events.waitForPageLoad();
- // load all macros inside ~/.vimperator/macros/
+ // load all macros inside ~/.xulmus/macros/
// setTimeout needed since io. is loaded after events.
setTimeout(function () {
try
@@ -678,16 +678,16 @@ function Events() //{{{
function () { events.onEscape(); });
// add the ":" mapping in all but insert mode mappings
- mappings.add([modes.NORMAL, modes.VISUAL, modes.HINTS, modes.MESSAGE, modes.COMPOSE, modes.CARET, modes.TEXTAREA],
+ mappings.add([modes.NORMAL, modes.PLAYER, modes.VISUAL, modes.HINTS, modes.MESSAGE, modes.COMPOSE, modes.CARET, modes.TEXTAREA],
[":"], "Enter command line mode",
function () { commandline.open(":", "", modes.EX); });
// focus events
- mappings.add([modes.NORMAL, modes.VISUAL, modes.CARET],
+ mappings.add([modes.NORMAL, modes.PLAYER, modes.VISUAL, modes.CARET],
["<Tab>"], "Advance keyboard focus",
function () { document.commandDispatcher.advanceFocus(); });
- mappings.add([modes.NORMAL, modes.VISUAL, modes.CARET, modes.INSERT, modes.TEXTAREA],
+ mappings.add([modes.NORMAL, modes.PLAYER,modes.VISUAL, modes.CARET, modes.INSERT, modes.TEXTAREA],
["<S-Tab>"], "Rewind keyboard focus",
function () { document.commandDispatcher.rewindFocus(); });
@@ -704,12 +704,12 @@ function Events() //{{{
function () { return; });
// macros
- mappings.add([modes.NORMAL, modes.MESSAGE],
+ mappings.add([modes.NORMAL, modes.PLAYER, modes.MESSAGE],
["q"], "Record a key sequence into a macro",
function (arg) { events.startRecording(arg); },
{ flags: Mappings.flags.ARGUMENT });
- mappings.add([modes.NORMAL, modes.MESSAGE],
+ mappings.add([modes.NORMAL, modes.PLAYER, modes.MESSAGE],
["@"], "Play a macro",
function (count, arg)
{
@@ -1037,8 +1037,8 @@ function Events() //{{{
// (i.e., cntrl codes 27--31)
// ---
// For more information, see:
- // [*] Vimp FAQ: http://vimperator.org/trac/wiki/Vimperator/FAQ#WhydoesntC-workforEscMacOSX
- // [*] Referenced mailing list msg: http://www.mozdev.org/pipermail/vimperator/2008-May/001548.html
+ // [*] Vimp FAQ: http://xulmus.org/trac/wiki/Xulmus/FAQ#WhydoesntC-workforEscMacOSX
+ // [*] Referenced mailing list msg: http://www.mozdev.org/pipermail/xulmus/2008-May/001548.html
// [*] Mozilla bug 416227: event.charCode in keypress handler has unexpected values on Mac for Ctrl with chars in "[ ] _ \"
// https://bugzilla.mozilla.org/show_bug.cgi?query_format=specific&order=relevance+desc&bug_status=__open__&id=416227
// [*] Mozilla bug 432951: Ctrl+'foo' doesn't seem same charCode as Meta+'foo' on Cocoa
@@ -1226,6 +1226,21 @@ function Events() //{{{
}
}
+ if(config.name == "Xulmus")
+ {
+ // Switch to -- PLAYER -- mode for Songbird Media Player.
+ if(config.isPlayerWindow)
+ {
+ liberator.mode = modes.PLAYER;
+ }
+ else
+ {
+ liberator.mode = modes.NORMAL;
+ }
+ return;
+ }
+
+
urlbar = document.getElementById("urlbar");
if (elem == null && urlbar && urlbar.inputField == lastFocus)
liberator.threadYield(true);
@@ -1421,8 +1436,8 @@ function Events() //{{{
// XXX: ugly hack for now pass certain keys to Firefox as they are without beeping
// also fixes key navigation in combo boxes, submitting forms, etc.
// FIXME: breaks iabbr for now --mst
- if ((config.name == "Vimperator" && liberator.mode == modes.NORMAL)
- || liberator.mode == modes.INSERT)
+ if (((config.name == "Xulmus" || config.name == "Vimperator") && liberator.mode == modes.NORMAL || liberator.mode == modes.INSERT))
+
{
if (key == "<Return>")
return false;
diff --git a/common/content/liberator.js b/common/content/liberator.js
index a26ed8fa..3a0cec85 100644
--- a/common/content/liberator.js
+++ b/common/content/liberator.js
@@ -26,6 +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 *****/
+
/** @scope modules */
Cu.import("resource://gre/modules/XPCOMUtils.jsm", modules);
@@ -70,7 +71,7 @@ const liberator = (function () //{{{
let nError = 0;
function loadModule(name, func)
{
- let message = "Loading module " + name + "...";
+ let message = "Loading module " + name + "...";
try
{
liberator.log(message, 0);
@@ -81,7 +82,10 @@ const liberator = (function () //{{{
catch (e)
{
if (nError++ == 0)
- window.toJavaScriptConsole();
+ liberator.dump("Error loading module - "+ name + "..");
+ liberator.dump(e);
+ liberator.dump(e.stack);
+ window.toJavaScriptConsole();
liberator.reportError(e);
}
}
@@ -1215,8 +1219,6 @@ const liberator = (function () //{{{
startup: function ()
{
let start = Date.now();
- liberator.log("Initializing liberator object...", 0);
-
config.features = config.features || [];
config.features.push(getPlatformFeature());
config.defaults = config.defaults || {};
@@ -1225,7 +1227,7 @@ const liberator = (function () //{{{
config.mailModes = config.mailModes || [modes.NORMAL];
// TODO: suitable defaults?
//config.mainWidget
- //config.mainWindowID
+ //config.mainWindowID
//config.visualbellWindow
//config.styleableChrome
config.autocommands = config.autocommands || [];
diff --git a/common/content/modes.js b/common/content/modes.js
index b00ec691..f0d71735 100644
--- a/common/content/modes.js
+++ b/common/content/modes.js
@@ -269,6 +269,7 @@ const modes = (function () //{{{
self.addMode("MESSAGE"); // for now only used in Muttator when the message has focus
self.addMode("COMPOSE");
self.addMode("CUSTOM", false, function () plugins.mode);
+ self.addMode("PLAYER"); // Player mode for songbird
// extended modes, can include multiple modes, and even main modes
self.addMode("EX", true);
self.addMode("HINTS", true);
diff --git a/common/content/services.js b/common/content/services.js
index 925be0a8..338e1c33 100644
--- a/common/content/services.js
+++ b/common/content/services.js
@@ -48,6 +48,7 @@ function Services()
self.add("appStartup", "@mozilla.org/toolkit/app-startup;1", Ci.nsIAppStartup);
self.add("autoCompleteSearch", "@mozilla.org/browser/global-history;2", Ci.nsIAutoCompleteSearch);
+ //self.add("autoCompleteSearch", "@mozilla.org/autocomplete/search;1?name=songbird-autocomplete", Ci.nsIAutoCompleteSearch);
self.add("browserSearch", "@mozilla.org/browser/search-service;1", Ci.nsIBrowserSearchService);
self.add("cache", "@mozilla.org/network/cache-service;1", Ci.nsICacheService);
self.add("console", "@mozilla.org/consoleservice;1", Ci.nsIConsoleService);
@@ -64,7 +65,8 @@ function Services()
self.add("threadManager", "@mozilla.org/thread-manager;1", Ci.nsIThreadManager);
self.add("windowMediator", "@mozilla.org/appshell/window-mediator;1", Ci.nsIWindowMediator);
self.add("windowWatcher", "@mozilla.org/embedcomp/window-watcher;1", Ci.nsIWindowWatcher);
-
+ self.add("bookmarks", "@mozilla.org/browser/nav-bookmarks-service;1", Ci.nsINavBookmarksService);
+
self.addClass("file", "@mozilla.org/file/local;1", Ci.nsILocalFile);
self.addClass("find", "@mozilla.org/embedcomp/rangefind;1", Ci.nsIFind);
self.addClass("process", "@mozilla.org/process/util;1", Ci.nsIProcess);
diff --git a/common/content/tabs.js b/common/content/tabs.js
index 8f5f6578..411f9213 100644
--- a/common/content/tabs.js
+++ b/common/content/tabs.js
@@ -109,7 +109,10 @@ function Tabs() //{{{
// hide tabs initially
if (config.name == "Vimperator")
getBrowser().mStrip.getElementsByClassName("tabbrowser-tabs")[0].collapsed = true;
-
+/*
+ if (config.name == "Xulmus")
+ getBrowser()._strip.getElementsByClassName(
+ */
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// OPTIONS /////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
@@ -148,7 +151,7 @@ function Tabs() //{{{
validator: Option.validateCompleter
});
- if (config.name == "Vimperator")
+ if (config.name == "Vimperator" || config.name == "Xulmus" )
{
options.add(["activate", "act"],
"Define when tabs are automatically activated",
@@ -238,7 +241,7 @@ function Tabs() //{{{
function (count) { tabs.select("-" + (count < 1 ? 1 : count), true); },
{ flags: Mappings.flags.COUNT });
- if (config.name == "Vimperator")
+ if (config.name == "Vimperator" || config.name == "Xulmus")
{
mappings.add([modes.NORMAL], ["b"],
"Open a prompt to switch buffers",
@@ -449,7 +452,7 @@ function Tabs() //{{{
function () { tabs.select(0, false); },
{ argCount: "0" });
- if (config.name == "Vimperator")
+ if (config.name == "Vimperator" || config.name == "Xulmus")
{
// TODO: "Zero count" if 0 specified as arg, multiple args and count ranges?
commands.add(["b[uffer]"],
@@ -584,7 +587,7 @@ function Tabs() //{{{
});
}
- if (liberator.has("session"))
+ if (liberator.has("session") && config.name != "Xulmus")
{
// TODO: extract common functionality of "undoall"
commands.add(["u[ndo]"],
@@ -780,6 +783,22 @@ function Tabs() //{{{
getBrowser().removeTab(tab);
else
liberator.beep();
+ },
+ Songbird: function (tab)
+ {
+ if (getBrowser().mTabs.length > 1)
+ getBrowser().removeTab(tab);
+ else
+ {
+ if (buffer.URL != "about:blank" ||
+ window.getWebNavigation().sessionHistory.count > 0)
+ {
+ liberator.open("about:blank", liberator.NEW_BACKGROUND_TAB);
+ getBrowser().removeTab(tab);
+ }
+ else
+ liberator.beep();
+ }
}
}[config.hostApplication] || function () {};
diff --git a/common/content/ui.js b/common/content/ui.js
index 6fdf8239..d8f076a4 100644
--- a/common/content/ui.js
+++ b/common/content/ui.js
@@ -568,7 +568,7 @@ function CommandLine() //{{{
var startHints = false; // whether we're waiting to start hints mode
var lastSubstring = "";
-
+
// the containing box for the promptWidget and commandWidget
const commandlineWidget = document.getElementById("liberator-commandline");
// the prompt for the current command, for example : or /. Can be blank
@@ -577,7 +577,7 @@ function CommandLine() //{{{
const commandWidget = document.getElementById("liberator-commandline-command");
const messageBox = document.getElementById("liberator-message");
-
+
commandWidget.inputField.QueryInterface(Ci.nsIDOMNSEditableElement);
messageBox.inputField.QueryInterface(Ci.nsIDOMNSEditableElement);
diff --git a/common/content/util.js b/common/content/util.js
index 5409d0c9..60477acf 100644
--- a/common/content/util.js
+++ b/common/content/util.js
@@ -170,7 +170,7 @@ const util = { //{{{
*/
computedStyle: function computedStyle(node)
{
- while (node instanceof Text && node.parentNode)
+ while (node instanceof Text && node.parentNode)
node = node.parentNode;
return node.ownerDocument.defaultView.getComputedStyle(node, null);
},
diff --git a/common/make_jar.sh b/common/make_jar.sh
index 81c23be3..291dc7d1 100644
--- a/common/make_jar.sh
+++ b/common/make_jar.sh
@@ -1,6 +1,7 @@
#!/bin/dash
set -e
+
top=$(pwd)
jar=$1
bases=$2
@@ -14,7 +15,7 @@ stage="$top/${jar%.*}"
mkdir -p $stage
getfiles () {
- filter="\.($(echo $1 | tr ' ' '|'))$"; shift
+ filter="\.($(echo $1 | tr ' ' '|'))$"; shift
find "$@" -not -path '*CVS*' 2>/dev/null | grep -E "$filter" || true
}
copytext () {
@@ -33,9 +34,9 @@ do
[ ${jar##*.} = jar ] && stage="$stage/${base##*/}"
for dir in $dirs
do
- for f in $(getfiles "$bin" "$dir")
+ for f in $(getfiles "$bin" "$dir")
do
- mkdir -p "$stage/${f%/*}"
+ mkdir -p "$stage/${f%/*}"
cp $f "$stage/$f"
done
for f in $(getfiles "$text" "$dir")
@@ -51,6 +52,8 @@ do
)
done
-(cd $stage; zip -r "$top/$jar" *)
+cd $stage
+zip -r "$top/$jar" *
+cd -
rm -rf "$stage"
diff --git a/common/skin/liberator.css b/common/skin/liberator.css
index 677adbef..48c22c33 100644
--- a/common/skin/liberator.css
+++ b/common/skin/liberator.css
@@ -174,7 +174,9 @@ statusbarpanel {
}
#liberator-completions-content *,
-#liberator-multiline-output-content * {
+#liberator-multiline-output-content *,
+#liberator-commandline-prompt *,
+#liberator-commandline-command {
font: inherit;
}
diff --git a/xulmus/Makefile b/xulmus/Makefile
new file mode 100755
index 00000000..118bb65e
--- /dev/null
+++ b/xulmus/Makefile
@@ -0,0 +1,9 @@
+#### configuration
+
+VERSION = 0.1
+NAME = xulmus
+
+include ../common/Makefile.common
+
+foo:
+ echo $$SHELL
diff --git a/xulmus/NEWS b/xulmus/NEWS
new file mode 100755
index 00000000..8b137891
--- /dev/null
+++ b/xulmus/NEWS
@@ -0,0 +1 @@
+
diff --git a/xulmus/chrome.manifest b/xulmus/chrome.manifest
new file mode 100755
index 00000000..3911ae16
--- /dev/null
+++ b/xulmus/chrome.manifest
@@ -0,0 +1,24 @@
+# Songbird
+content xulmus content/
+skin xulmus classic/1.0 skin/
+locale liberator en-US locale/en-US/
+
+content liberator ../common/content/
+resource liberator ../common/modules/
+skin liberator classic/1.0 ../common/skin/
+
+override chrome://liberator/content/liberator.dtd chrome://xulmus/content/liberator.dtd
+override chrome://liberator/content/config.js chrome://xulmus/content/config.js
+
+overlay chrome://songbird/content/xul/layoutBaseOverlay.xul chrome://xulmus/content/xulmus.xul
+overlay chrome://songbird/content/xul/layoutBaseOverlay.xul chrome://liberator/content/liberator.xul
+
+
+#overlay chrome://songbird/content/xul/layoutWithBrowserOverlay.xul chrome://xulmus/content/xulmus.xul
+#overlay chrome://songbird/content/xul/layoutWithBrowserOverlay.xul chrome://liberator/content/liberator.xul
+
+#overlay chrome://songbird/content/xul/layoutWithoutBrowserOverlay.xul chrome://xulmus/content/xulmus.xul
+#overlay chrome://songbird/content/xul/layoutWithoutBrowserOverlay.xul chrome://liberator/content/liberator.xul
+
+#overlay windowtype:Songbird:Main chrome://liberator/content/liberator.xul
+#overlay windowtype:Songbird:Main chrome://xulmus/content/xulmus.xul
diff --git a/xulmus/components/chrome-data.js b/xulmus/components/chrome-data.js
new file mode 100755
index 00000000..74dc57a2
--- /dev/null
+++ b/xulmus/components/chrome-data.js
@@ -0,0 +1,87 @@
+/* Adds support for data: URIs with chrome privileges
+ * and fragment identifiers.
+ *
+ * "chrome-data:" <content-type> [; <flag>]* "," [<data>]
+ *
+ * By Kris Maglione, ideas from Ed Anuff's nsChromeExtensionHandler.
+ *
+ * Licenced under the MIT License, which allows for sublicensing
+ * under any compatible license, including the GNU GPL and the MPL.
+ */
+
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
+const NS_BINDING_ABORTED = 0x804b0002;
+const nsIProtocolHandler = Components.interfaces.nsIProtocolHandler;
+
+const ioService = Components.classes["@mozilla.org/network/io-service;1"]
+ .getService(Components.interfaces.nsIIOService);
+
+let channel = Components.classesByID["{61ba33c0-3031-11d3-8cd0-0060b0fc14a3}"]
+ .getService(Components.interfaces.nsIProtocolHandler)
+ .newChannel(ioService.newURI("chrome://liberator/content/data", null, null))
+ .QueryInterface(Components.interfaces.nsIRequest);
+const systemPrincipal = channel.owner;
+channel.cancel(NS_BINDING_ABORTED);
+delete channel;
+
+var instance;
+function ChromeData() {}
+ChromeData.prototype = {
+ contractID: "@mozilla.org/network/protocol;1?name=chrome-data",
+ classID: Components.ID("{c1b67a07-18f7-4e13-b361-2edcc35a5a0d}"),
+ classDescription: "Data URIs with chrome privileges",
+ QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIProtocolHandler]),
+ _xpcom_factory: {
+ createInstance: function (outer, iid)
+ {
+ if (!instance)
+ instance = new ChromeData();
+ if (outer != null)
+ throw Components.results.NS_ERROR_NO_AGGREGATION;
+ return instance.QueryInterface(iid);
+ }
+ },
+
+ scheme: "chrome-data",
+ defaultPort: -1,
+ allowPort: function (port, scheme) false,
+ protocolFlags: nsIProtocolHandler.URI_NORELATIVE
+ | nsIProtocolHandler.URI_NOAUTH
+ | nsIProtocolHandler.URI_IS_UI_RESOURCE,
+
+ newURI: function (spec, charset, baseURI)
+ {
+ var uri = Components.classes["@mozilla.org/network/standard-url;1"]
+ .createInstance(Components.interfaces.nsIStandardURL)
+ .QueryInterface(Components.interfaces.nsIURI);
+ uri.init(1, -1, spec, charset, null);
+ return uri;
+ },
+
+ newChannel: function (uri)
+ {
+ try
+ {
+ if (uri.scheme == this.scheme)
+ {
+ let newURI = ioService.newURI(uri.spec.replace(/^.*?:\/*(.*)(?:#.*)?/, "data:$1"), null, null);
+ let channel = ioService.newChannelFromURI(newURI);
+ channel.owner = systemPrincipal;
+ channel.originalURI = uri;
+ return channel;
+ }
+ }
+ catch (e) {}
+ throw Components.results.NS_ERROR_FAILURE;
+ }
+};
+
+var components = [ChromeData];
+
+function NSGetModule(compMgr, fileSpec)
+{
+ return XPCOMUtils.generateModule(components);
+}
+
+// vim: set fdm=marker sw=4 ts=4 et:
diff --git a/xulmus/content/bookmarks.js b/xulmus/content/bookmarks.js
new file mode 100755
index 00000000..1e0ca0a0
--- /dev/null
+++ b/xulmus/content/bookmarks.js
@@ -0,0 +1,1146 @@
+/***** 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.
+
+Copyright (c) 2006-2009 by 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 *****/
+Components.utils.import("resource://gre/modules/utils.js");
+const DEFAULT_FAVICON = "chrome://mozapps/skin/places/defaultFavicon.png";
+
+// Try to import older command line history, quick marks, etc.
+liberator.registerObserver("load", function () {
+ if (!options.getPref("extensions.xulmus.commandline_cmd_history"))
+ return;
+
+ let store = storage["history-command"];
+ let pref = options.getPref("extensions.xulmus.commandline_cmd_history");
+ for (let [k, v] in Iterator(pref.split("\n")))
+ store.push(v);
+
+ store = storage["quickmarks"];
+ pref = options.getPref("extensions.xulmus.quickmarks")
+ .split("\n");
+ while (pref.length > 0)
+ store.set(pref.shift(), pref.shift());
+
+ options.resetPref("extensions.xulmus.commandline_cmd_history");
+ options.resetPref("extensions.xulmus.commandline_search_history");
+ options.resetPref("extensions.xulmus.quickmarks");
+});
+
+// also includes methods for dealing with keywords and search engines
+function Bookmarks() //{{{
+{
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////// PRIVATE SECTION /////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+ const historyService = PlacesUtils.history; //Cc["@mozilla.org/browser/global-history;1"].getService(Ci.nsIGlobalHistory);
+ const bookmarksService = PlacesUtils.bookmarks //Cc["@songbirdnest.com/servicepane/bookmarks;1"].getService(Ci.sbIBookmarks);
+ const taggingService = PlacesUtils.tagging //Cc["@mozilla.org/browser/tagging-service;1"].getService(Ci.nsITaggingService);
+ const faviconService = Cc["@mozilla.org/browser/favicon-service;1"].getService(Ci.nsIFaviconService);
+
+ // XXX for strange Firefox bug :(
+ // Error: [Exception... "Component returned failure code: 0x8000ffff (NS_ERROR_UNEXPECTED) [nsIObserverService.addObserver]"
+ // nsresult: "0x8000ffff (NS_ERROR_UNEXPECTED)"
+ // location: "JS frame :: file://~firefox/components/nsTaggingService.js :: anonymous :: line 89"
+ // data: no]
+ // Source file: file://~firefox/components/nsTaggingService.js
+ taggingService.getTagsForURI(window.makeURI("http://mysterious.bug"), {});
+
+ const Bookmark = new Struct("url", "title", "icon", "keyword", "tags", "id");
+ const Keyword = new Struct("keyword", "title", "icon", "url");
+ Bookmark.defaultValue("icon", function () getFavicon(this.url));
+ Bookmark.prototype.__defineGetter__("extra", function () [
+ ["keyword", this.keyword, "Keyword"],
+ ["tags", this.tags.join(", "), "Tag"]
+ ].filter(function (item) item[1]));
+
+ const storage = modules.storage;
+ function Cache(name, store, serial)
+ {
+ const rootFolders = [bookmarksService.toolbarFolder, bookmarksService.bookmarksMenuFolder, bookmarksService.unfiledBookmarksFolder];
+ const sleep = liberator.sleep;
+
+ let bookmarks = [];
+ let self = this;
+
+ this.__defineGetter__("name", function () name);
+ this.__defineGetter__("store", function () store);
+ this.__defineGetter__("bookmarks", function () this.load());
+
+ this.__defineGetter__("keywords",
+ function () [new Keyword(k.keyword, k.title, k.icon, k.url) for each (k in self.bookmarks) if (k.keyword)]);
+
+ this.__iterator__ = function () (val for each (val in self.bookmarks));
+
+ function loadBookmark(node)
+ {
+ let uri = util.newURI(node.uri);
+ let keyword = bookmarksService.getKeywordForBookmark(node.itemId);
+ let tags = taggingService.getTagsForURI(uri, {}) || [];
+ let bmark = new Bookmark(node.uri, node.title, node.icon && node.icon.spec, keyword, tags, node.itemId);
+
+ bookmarks.push(bmark);
+
+ return bmark;
+ }
+
+ function readBookmark(id)
+ {
+ return {
+ itemId: id,
+ uri: bookmarksService.getBookmarkURI(id).spec,
+ title: bookmarksService.getItemTitle(id)
+ };
+ }
+
+ function deleteBookmark(id)
+ {
+ let length = bookmarks.length;
+ bookmarks = bookmarks.filter(function (item) item.id != id);
+ return bookmarks.length < length;
+ }
+
+ function findRoot(id)
+ {
+ do
+ {
+ var root = id;
+ id = bookmarksService.getFolderIdForItem(id);
+ } while (id != bookmarksService.placesRoot && id != root);
+ return root;
+ }
+
+ let loading = false;
+ this.load = function load()
+ {
+ if (loading)
+ {
+ while (loading)
+ sleep(10);
+ return bookmarks;
+ }
+
+ // update our bookmark cache
+ bookmarks = [];
+ loading = true;
+
+ let folders = rootFolders.slice();
+ let query = historyService.getNewQuery();
+ let options = historyService.getNewQueryOptions();
+ while (folders.length > 0)
+ {
+ query.setFolders(folders, 1);
+ folders.shift();
+ let result = historyService.executeQuery(query, options);
+ let folder = result.root;
+ folder.containerOpen = true;
+
+ // iterate over the immediate children of this folder
+ for (let i = 0; i < folder.childCount; i++)
+ {
+ let node = folder.getChild(i);
+ if (node.type == node.RESULT_TYPE_FOLDER) // folder
+ folders.push(node.itemId);
+ else if (node.type == node.RESULT_TYPE_URI) // bookmark
+ loadBookmark(node);
+ }
+
+ // close a container after using it!
+ folder.containerOpen = false;
+ }
+ this.__defineGetter__("bookmarks", function () bookmarks);
+ loading = false;
+ return bookmarks;
+ };
+
+ var observer = {
+ onBeginUpdateBatch: function onBeginUpdateBatch() {},
+ onEndUpdateBatch: function onEndUpdateBatch() {},
+ onItemVisited: function onItemVisited() {},
+ onItemMoved: function onItemMoved() {},
+ onItemAdded: function onItemAdded(itemId, folder, index)
+ {
+ // liberator.dump("onItemAdded(" + itemId + ", " + folder + ", " + index + ")\n");
+ if (bookmarksService.getItemType(itemId) == bookmarksService.TYPE_BOOKMARK)
+ {
+ if (rootFolders.indexOf(findRoot(itemId)) >= 0)
+ {
+ let bmark = loadBookmark(readBookmark(itemId));
+ storage.fireEvent(name, "add", bmark);
+ }
+ }
+ },
+ onItemRemoved: function onItemRemoved(itemId, folder, index)
+ {
+ // liberator.dump("onItemRemoved(" + itemId + ", " + folder + ", " + index + ")\n");
+ if (deleteBookmark(itemId))
+ storage.fireEvent(name, "remove", itemId);
+ },
+ onItemChanged: function onItemChanged(itemId, property, isAnnotation, value)
+ {
+ if (isAnnotation)
+ return;
+ // liberator.dump("onItemChanged(" + itemId + ", " + property + ", " + value + ")\n");
+ let bookmark = bookmarks.filter(function (item) item.id == itemId)[0];
+ if (bookmark)
+ {
+ if (property == "tags")
+ value = taggingService.getTagsForURI(util.newURI(bookmark.url), {});
+ if (property in bookmark)
+ bookmark[property] = value;
+ storage.fireEvent(name, "change", itemId);
+ }
+ },
+ QueryInterface: function QueryInterface(iid)
+ {
+ if (iid.equals(Ci.nsINavBookmarkObserver) || iid.equals(Ci.nsISupports))
+ return this;
+ throw Cr.NS_ERROR_NO_INTERFACE;
+ }
+ };
+
+ bookmarksService.addObserver(observer, false);
+ }
+
+ function getFavicon(uri)
+ {
+ try
+ {
+ return faviconService.getFaviconImageForPage(util.newURI(uri)).spec;
+ }
+ catch (e)
+ {
+ return "";
+ }
+ }
+
+ let bookmarkObserver = function (key, event, arg)
+ {
+ if (event == "add")
+ autocommands.trigger("BookmarkAdd", arg);
+ statusline.updateUrl();
+ };
+
+ var cache = storage.newObject("bookmark-cache", Cache, false);
+ storage.addObserver("bookmark-cache", bookmarkObserver, window);
+
+ liberator.registerObserver("enter", function () {
+ if (options["preload"])
+ {
+ // Forces a load, if not already loaded but wait 10sec
+ // so most tabs should be restored and the CPU should be idle again usually
+ setTimeout(function () { liberator.callFunctionInThread(null, function () cache.bookmarks); }, 10000);
+ }
+ });
+
+ /////////////////////////////////////////////////////////////////////////////}}}
+ ////////////////////// OPTIONS /////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+ options.add(["defsearch", "ds"],
+ "Set the default search engine",
+ "string", "google",
+ {
+ completer: function completer(context)
+ {
+ completion.search(context, true)
+ context.completions = [["", "Don't perform searches by default"]].concat(context.completions);
+ },
+ validator: Option.validateCompleter
+ });
+
+ options.add(["preload"],
+ "Speed up first time history/bookmark completion",
+ "boolean", true);
+
+ /////////////////////////////////////////////////////////////////////////////}}}
+ ////////////////////// MAPPINGS ////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+ var myModes = config.browserModes;
+
+ mappings.add(myModes, ["a"],
+ "Open a prompt to bookmark the current URL",
+ function ()
+ {
+ let title = "";
+ if (buffer.title != buffer.URL)
+ title = " -title=\"" + buffer.title + "\"";
+ commandline.open(":", "bmark " + buffer.URL + title, modes.EX);
+ });
+
+ mappings.add(myModes, ["A"],
+ "Toggle bookmarked state of current URL",
+ function () { bookmarks.toggle(buffer.URL); });
+
+ /////////////////////////////////////////////////////////////////////////////}}}
+ ////////////////////// COMMANDS ////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+ commands.add(["ju[mps]"],
+ "Show jumplist",
+ function ()
+ {
+ let sh = window.getWebNavigation().sessionHistory;
+
+ let entries = [sh.getEntryAtIndex(i, false) for (i in util.range(0, sh.count))];
+ let list = template.jumps(sh.index, entries);
+ commandline.echo(list, commandline.HL_NORMAL, commandline.FORCE_MULTILINE);
+ },
+ { argCount: "0" });
+
+ // TODO: Clean this up.
+ function tags(context, args)
+ {
+ let filter = context.filter;
+ let have = filter.split(",");
+
+ args.completeFilter = have.pop();
+
+ let prefix = filter.substr(0, filter.length - args.completeFilter.length);
+ let tags = util.Array.uniq(util.Array.flatten([b.tags for ([k, b] in Iterator(cache.bookmarks))]));
+
+ return [[prefix + tag, tag] for ([i, tag] in Iterator(tags)) if (have.indexOf(tag) < 0)];
+ }
+
+ function title(context, args)
+ {
+ if (!args.bang)
+ return [[content.document.title, "Current Page Title"]];
+ context.keys.text = "title";
+ context.keys.description = "url";
+ return bookmarks.get(args.join(" "), args["-tags"], null, { keyword: args["-keyword"], title: context.filter });
+ }
+
+ function keyword(context, args)
+ {
+ if (!args.bang)
+ return [];
+ context.keys.text = "keyword";
+ return bookmarks.get(args.join(" "), args["-tags"], null, { keyword: context.filter, title: args["-title"] });
+ }
+
+ commands.add(["bma[rk]"],
+ "Add a bookmark",
+ function (args)
+ {
+ let url = args.length == 0 ? buffer.URL : args[0];
+ let title = args["-title"] || (args.length == 0 ? buffer.title : null);
+ let keyword = args["-keyword"] || null;
+ let tags = args["-tags"] || [];
+
+ if (bookmarks.add(false, title, url, keyword, tags, args.bang))
+ {
+ let extra = (title == url) ? "" : " (" + title + ")";
+ liberator.echomsg("Added bookmark: " + url + extra, 1, commandline.FORCE_SINGLELINE);
+ }
+ else
+ liberator.echoerr("Exxx: Could not add bookmark `" + title + "'", commandline.FORCE_SINGLELINE);
+ },
+ {
+ argCount: "?",
+ bang: true,
+ completer: function (context, args)
+ {
+ if (!args.bang)
+ {
+ context.completions = [[content.document.documentURI, "Current Location"]];
+ return;
+ }
+ completion.bookmark(context, args["-tags"], { keyword: args["-keyword"], title: args["-title"] });
+ },
+ options: [[["-title", "-t"], commands.OPTION_STRING, null, title],
+ [["-tags", "-T"], commands.OPTION_LIST, null, tags],
+ [["-keyword", "-k"], commands.OPTION_STRING, function (arg) /\w/.test(arg)]]
+ });
+
+ commands.add(["bmarks"],
+ "List or open multiple bookmarks",
+ function (args)
+ {
+ bookmarks.list(args.join(" "), args["-tags"] || [], args.bang, args["-max"]);
+ },
+ {
+ bang: true,
+ completer: function completer(context, args)
+ {
+ context.quote = null;
+ context.filter = args.join(" ");
+ completion.bookmark(context, args["-tags"]);
+ },
+ options: [[["-tags", "-T"], commands.OPTION_LIST, null, tags],
+ [["-max", "-m"], commands.OPTION_INT]]
+ });
+
+ commands.add(["delbm[arks]"],
+ "Delete a bookmark",
+ function (args)
+ {
+ let url = args.string || buffer.URL;
+ let deletedCount = bookmarks.remove(url);
+
+ liberator.echomsg(deletedCount + " bookmark(s) with url `" + url + "' deleted", 1, commandline.FORCE_SINGLELINE);
+ },
+ {
+ argCount: "?",
+ completer: function completer(context) completion.bookmark(context),
+ literal: 0
+ });
+
+ /////////////////////////////////////////////////////////////////////////////}}}
+ ////////////////////// PUBLIC SECTION //////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+ return {
+
+ get format() ({
+ anchored: false,
+ title: ["URL", "Info"],
+ keys: { text: "url", description: "title", icon: "icon", extra: "extra", tags: "tags" },
+ process: [template.icon, template.bookmarkDescription]
+ }),
+
+ // if "bypassCache" is true, it will force a reload of the bookmarks database
+ // on my PC, it takes about 1ms for each bookmark to load, so loading 1000 bookmarks
+ // takes about 1 sec
+ get: function get(filter, tags, maxItems, extra)
+ {
+ return completion.runCompleter("bookmark", filter, maxItems, tags, extra);
+ },
+
+ // if starOnly = true it is saved in the unfiledBookmarksFolder, otherwise in the bookmarksMenuFolder
+ add: function add(starOnly, title, url, keyword, tags, force)
+ {
+ try
+ {
+ let uri = util.createURI(url);
+ if (!force)
+ {
+ for (let bmark in cache)
+ {
+ if (bmark[0] == uri.spec)
+ {
+ var id = bmark[5];
+ if (title)
+ bookmarksService.setItemTitle(id, title);
+ break;
+ }
+ }
+ }
+ if (id == undefined)
+ id = bookmarksService.insertBookmark(
+ bookmarksService[starOnly ? "unfiledBookmarksFolder" : "bookmarksMenuFolder"],
+ uri, -1, title || url);
+ if (!id)
+ return false;
+
+ if (keyword)
+ bookmarksService.setKeywordForBookmark(id, keyword);
+ if (tags)
+ taggingService.tagURI(uri, tags);
+ }
+ catch (e)
+ {
+ liberator.log(e, 0);
+ return false;
+ }
+
+ return true;
+ },
+
+ toggle: function toggle(url)
+ {
+ if (!url)
+ return;
+
+ let count = this.remove(url);
+ if (count > 0)
+ {
+ commandline.echo("Removed bookmark: " + url, commandline.HL_NORMAL, commandline.FORCE_SINGLELINE);
+ }
+ else
+ {
+ let title = buffer.title || url;
+ let extra = "";
+ if (title != url)
+ extra = " (" + title + ")";
+ this.add(true, title, url);
+ commandline.echo("Added bookmark: " + url + extra, commandline.HL_NORMAL, commandline.FORCE_SINGLELINE);
+ }
+ },
+
+ isBookmarked: function isBookmarked(url)
+ {
+ try
+ {
+ let uri = util.newURI(url);
+ return (bookmarksService.getBookmarkedURIFor(uri) != null);
+ }
+ catch (e)
+ {
+ return false;
+ }
+ },
+
+ // returns number of deleted bookmarks
+ remove: function remove(url)
+ {
+ if (!url)
+ return 0;
+
+ let i = 0;
+ try
+ {
+ let uri = util.newURI(url);
+ var count = {};
+ let bmarks = bookmarksService.getBookmarkIdsForURI(uri, count);
+
+ for (; i < bmarks.length; i++)
+ bookmarksService.removeItem(bmarks[i]);
+ }
+ catch (e)
+ {
+ liberator.log(e, 0);
+ return i;
+ }
+
+ // update the display of our "bookmarked" symbol
+ statusline.updateUrl();
+
+ return count.value;
+ },
+
+ getFavicon: function (url) getFavicon(url),
+
+ // TODO: add filtering
+ // also ensures that each search engine has a Vimperator-friendly alias
+ getSearchEngines: function getSearchEngines()
+ {
+ let searchEngines = [];
+ let firefoxEngines = services.get("browserSearch").getVisibleEngines({});
+ for (let [,engine] in Iterator(firefoxEngines))
+ {
+ let alias = engine.alias;
+ if (!alias || !/^[a-z0-9_-]+$/.test(alias))
+ alias = engine.name.replace(/^\W*([a-zA-Z_-]+).*/, "$1").toLowerCase();
+ if (!alias)
+ alias = "search"; // for search engines which we can't find a suitable alias
+
+ // make sure we can use search engines which would have the same alias (add numbers at the end)
+ let newAlias = alias;
+ for (let j = 1; j <= 10; j++) // <=10 is intentional
+ {
+ if (!searchEngines.some(function (item) item[0] == newAlias))
+ break;
+
+ newAlias = alias + j;
+ }
+ // only write when it changed, writes are really slow
+ if (engine.alias != newAlias)
+ engine.alias = newAlias;
+
+ searchEngines.push([engine.alias, engine.description, engine.iconURI && engine.iconURI.spec]);
+ }
+
+ return searchEngines;
+ },
+
+ getSuggestions: function getSuggestions(engineName, query, callback)
+ {
+ const responseType = "application/x-suggestions+json";
+
+ let engine = services.get("browserSearch").getEngineByAlias(engineName);
+
+ if (engine && engine.supportsResponseType(responseType))
+ var queryURI = engine.getSubmission(query, responseType).uri.spec;
+ if (!queryURI)
+ return [];
+
+ function process(resp)
+ {
+ let results = [];
+ try
+ {
+ results = services.get("json").decode(resp.responseText)[1];
+ results = [[item, ""] for ([k, item] in Iterator(results)) if (typeof item == "string")];
+ }
+ catch (e) {}
+ if (!callback)
+ return results;
+ callback(results);
+ }
+
+ let resp = util.httpGet(queryURI, callback && process);
+
+ if (!callback)
+ return process(resp);
+ },
+
+ // TODO: add filtering
+ // format of returned array:
+ // [keyword, helptext, url]
+ getKeywords: function getKeywords()
+ {
+ return cache.keywords;
+ },
+
+ // full search string including engine name as first word in @param text
+ // if @param useDefSearch is true, it uses the default search engine
+ // @returns the url for the search string
+ // if the search also requires a postData, [url, postData] is returned
+ getSearchURL: function getSearchURL(text, useDefsearch)
+ {
+ let url = null;
+ let aPostDataRef = {};
+ let searchString = (useDefsearch ? options["defsearch"] + " " : "") + text;
+
+ // we need to make sure our custom alias have been set, even if the user
+ // did not :open <tab> once before
+ this.getSearchEngines();
+
+
+ function getShortcutOrURI(aURL, aPostDataRef)
+ {
+ var shortcutURL = null;
+ var keyword = aURL;
+ var param = "";
+ var searchService = Cc['@mozilla.org/browser/search-service;1'].getService(Ci.nsIBrowserSearchService);
+ var offset = aURL.indexOf(" ");
+ if (offset > 0)
+ {
+ keyword = aURL.substr(0, offset);
+ param = aURL.substr(offset + 1);
+ }
+ if (!aPostDataRef)
+ {
+ aPostDataRef = {};
+ }
+ var engine = searchService.getEngineByAlias(keyword);
+ if (engine)
+ {
+ var submission = engine.getSubmission(param, null);
+ aPostDataRef.value = submission.postData;
+ return submission.uri.spec;
+ }
+ [shortcutURL, aPostDataRef.value] = PlacesUtils.getURLAndPostDataForKeyword(keyword);
+ if (!shortcutURL)
+ {
+ return aURL;
+ }
+ var postData = "";
+ if (aPostDataRef.value)
+ {
+ postData = unescape(aPostDataRef.value);
+ }
+ if (/%s/i.test(shortcutURL) || /%s/i.test(postData))
+ {
+ var charset = "";
+ const re = /^(.*)\&mozcharset=([a-zA-Z][_\-a-zA-Z0-9]+)\s*$/;
+ var matches = shortcutURL.match(re);
+ if (matches)
+ {
+ [, shortcutURL, charset] = matches;
+ }
+ else
+ {
+ try
+ {
+ charset = PlacesUtils.history.getCharsetForURI(makeURI(shortcutURL));
+ } catch (e) { }
+ }
+ var encodedParam = "";
+ if (charset)
+ {
+ encodedParam = escape(convertFromUnicode(charset, param));
+ } else {
+ encodedParam = encodeURIComponent(param);
+ }
+ shortcutURL = shortcutURL.replace(/%s/g, encodedParam).replace(/%S/g, param);
+ if (/%s/i.test(postData))
+ {
+ aPostDataRef.value = getPostDataStream(postData, param, encodedParam, "application/x-www-form-urlencoded");
+ }
+ } else if (param) {
+ aPostDataRef.value = null;
+ return aURL;
+ }
+ return shortcutURL;
+ }
+ url = getShortcutOrURI(searchString, aPostDataRef);
+ if (url == searchString)
+ url = null;
+
+ if (aPostDataRef && aPostDataRef.value)
+ return [url, aPostDataRef.value];
+ else
+ return url; // can be null
+ },
+
+ // if openItems is true, open the matching bookmarks items in tabs rather than display
+ list: function list(filter, tags, openItems, maxItems)
+ {
+ // FIXME: returning here doesn't make sense
+ // Why the hell doesn't it make sense? --Kris
+ // Because it unconditionally bypasses the final error message
+ // block and does so only when listing items, not opening them. In
+ // short it breaks the :bmarks command which doesn't make much
+ // sense to me but I'm old-fashioned. --djk
+ if (!openItems)
+ return completion.listCompleter("bookmark", filter, maxItems, tags);
+ let items = completion.runCompleter("bookmark", filter, maxItems, tags);
+
+ if (items.length)
+ return liberator.open(items.map(function (i) i.url), liberator.NEW_TAB);
+
+ if (filter.length > 0 && tags.length > 0)
+ liberator.echoerr("E283: No bookmarks matching tags: \"" + tags + "\" and string: \"" + filter + "\"");
+ else if (filter.length > 0)
+ liberator.echoerr("E283: No bookmarks matching string: \"" + filter + "\"");
+ else if (tags.length > 0)
+ liberator.echoerr("E283: No bookmarks matching tags: \"" + tags + "\"");
+ else
+ liberator.echoerr("No bookmarks set");
+ }
+ };
+ //}}}
+}; //}}}
+
+function History() //{{{
+{
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////// PRIVATE SECTION /////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+ const historyService = PlacesUtils.history;
+
+ /////////////////////////////////////////////////////////////////////////////}}}
+ ////////////////////// MAPPINGS ////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+ var myModes = config.browserModes;
+
+ mappings.add(myModes,
+ ["<C-o>"], "Go to an older position in the jump list",
+ function (count) { history.stepTo(-(count > 1 ? count : 1)); },
+ { flags: Mappings.flags.COUNT });
+
+ mappings.add(myModes,
+ ["<C-i>"], "Go to a newer position in the jump list",
+ function (count) { history.stepTo(count > 1 ? count : 1); },
+ { flags: Mappings.flags.COUNT });
+
+ mappings.add(myModes,
+ ["H", "<A-Left>", "<M-Left>"], "Go back in the browser history",
+ function (count) { history.stepTo(-(count > 1 ? count : 1)); },
+ { flags: Mappings.flags.COUNT });
+
+ mappings.add(myModes,
+ ["L", "<A-Right>", "<M-Right>"], "Go forward in the browser history",
+ function (count) { history.stepTo(count > 1 ? count : 1); },
+ { flags: Mappings.flags.COUNT });
+
+ /////////////////////////////////////////////////////////////////////////////}}}
+ ////////////////////// COMMANDS ////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+ commands.add(["ba[ck]"],
+ "Go back in the browser history",
+ function (args)
+ {
+ let url = args.literalArg;
+
+ if (args.bang)
+ {
+ history.goToStart();
+ }
+ else
+ {
+ if (url)
+ {
+ let sh = window.getWebNavigation().sessionHistory;
+ for (let i in util.range(sh.index, 0, -1))
+ {
+ if (sh.getEntryAtIndex(i, false).URI.spec == url)
+ {
+ window.getWebNavigation().gotoIndex(i);
+ return;
+ }
+ }
+ liberator.echoerr("Exxx: URL not found in history");
+ }
+ else
+ {
+ history.stepTo(-Math.max(args.count, 1));
+ }
+ }
+ },
+ {
+ argCount: "?",
+ bang: true,
+ completer: function completer(context)
+ {
+ let sh = window.getWebNavigation().sessionHistory;
+
+ context.anchored = false;
+ context.completions = [sh.getEntryAtIndex(i, false) for (i in util.range(sh.index, 0, -1))];
+ context.keys = { text: function (item) item.URI.spec, description: "title" };
+ },
+ count: true,
+ literal: 0
+ });
+
+ commands.add(["fo[rward]", "fw"],
+ "Go forward in the browser history",
+ function (args)
+ {
+ let url = args.literalArg;
+
+ if (args.bang)
+ {
+ history.goToEnd();
+ }
+ else
+ {
+ if (url)
+ {
+ let sh = window.getWebNavigation().sessionHistory;
+ for (let i in util.range(sh.index + 1, sh.count))
+ {
+ if (sh.getEntryAtIndex(i, false).URI.spec == url)
+ {
+ window.getWebNavigation().gotoIndex(i);
+ return;
+ }
+ }
+ liberator.echoerr("Exxx: URL not found in history");
+ }
+ else
+ {
+ history.stepTo(Math.max(args.count, 1));
+ }
+ }
+ },
+ {
+ argCount: "?",
+ bang: true,
+ completer: function completer(context)
+ {
+ let sh = window.getWebNavigation().sessionHistory;
+
+ context.anchored = false;
+ context.completions = [sh.getEntryAtIndex(i, false) for (i in util.range(sh.index + 1, sh.count))];
+ context.keys = { text: function (item) item.URI.spec, description: "title" };
+ },
+ count: true,
+ literal: 0
+ });
+
+ commands.add(["hist[ory]", "hs"],
+ "Show recently visited URLs",
+ function (args) { history.list(args.join(" "), args.bang, args["-max"] || 1000); },
+ {
+ bang: true,
+ completer: function (context) { context.quote = null; completion.history(context); },
+ // completer: function (filter) completion.history(filter)
+ options: [[["-max", "-m"], options.OPTION_INT]]
+ });
+
+ /////////////////////////////////////////////////////////////////////////////}}}
+ ////////////////////// PUBLIC SECTION //////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+ return {
+
+ get format() bookmarks.format,
+
+ get service() historyService,
+
+ get: function get(filter, maxItems)
+ {
+ // no query parameters will get all history
+ let query = historyService.getNewQuery();
+ let options = historyService.getNewQueryOptions();
+
+ if (typeof filter == "string")
+ filter = { searchTerms: filter };
+ for (let [k, v] in Iterator(filter))
+ query[k] = v;
+ options.sortingMode = options.SORT_BY_DATE_DESCENDING;
+ options.resultType = options.RESULTS_AS_URI;
+ if (maxItems > 0)
+ options.maxResults = maxItems;
+
+ // execute the query
+ let root = historyService.executeQuery(query, options).root;
+ root.containerOpen = true;
+ let items = util.map(util.range(0, root.childCount), function (i) {
+ let node = root.getChild(i);
+ return {
+ url: node.uri,
+ title: node.title,
+ icon: node.icon ? node.icon.spec : DEFAULT_FAVICON
+ };
+ });
+ root.containerOpen = false; // close a container after using it!
+
+ return items;
+ },
+
+ // TODO: better names and move to buffer.?
+ stepTo: function stepTo(steps)
+ {
+ let index = window.getWebNavigation().sessionHistory.index + steps;
+ if (index >= 0 && index < window.getWebNavigation().sessionHistory.count)
+ window.getWebNavigation().gotoIndex(index);
+ else
+ liberator.beep(); // XXX: really wanted?
+ },
+
+ goToStart: function goToStart()
+ {
+ let index = window.getWebNavigation().sessionHistory.index;
+
+ if (index > 0)
+ window.getWebNavigation().gotoIndex(0);
+ else
+ liberator.beep(); // XXX: really wanted?
+
+ },
+
+ goToEnd: function goToEnd()
+ {
+ let sh = window.getWebNavigation().sessionHistory;
+ let max = sh.count - 1;
+
+ if (sh.index < max)
+ window.getWebNavigation().gotoIndex(max);
+ else
+ liberator.beep(); // XXX: really wanted?
+
+ },
+
+ // if openItems is true, open the matching history items in tabs rather than display
+ list: function list(filter, openItems, maxItems)
+ {
+ // FIXME: returning here doesn't make sense
+ // Why the hell doesn't it make sense? --Kris
+ // See comment at bookmarks.list --djk
+ if (!openItems)
+ return completion.listCompleter("history", filter, maxItems);
+ let items = completion.runCompleter("history", filter, maxItems);
+
+ if (items.length)
+ return liberator.open(items.map(function (i) i.url), liberator.NEW_TAB);
+
+ if (filter.length > 0)
+ liberator.echoerr("E283: No history matching \"" + filter + "\"");
+ else
+ liberator.echoerr("No history set");
+ }
+ };
+ //}}}
+}; //}}}
+
+function QuickMarks() //{{{
+{
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////// PRIVATE SECTION /////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+ var qmarks = storage.newMap("quickmarks", true);
+
+ /////////////////////////////////////////////////////////////////////////////}}}
+ ////////////////////// MAPPINGS ////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+ var myModes = config.browserModes;
+
+ mappings.add(myModes,
+ ["go"], "Jump to a QuickMark",
+ function (arg) { quickmarks.jumpTo(arg, liberator.CURRENT_TAB); },
+ { flags: Mappings.flags.ARGUMENT });
+
+ mappings.add(myModes,
+ ["gn"], "Jump to a QuickMark in a new tab",
+ function (arg)
+ {
+ quickmarks.jumpTo(arg,
+ /\bquickmark\b/.test(options["activate"]) ?
+ liberator.NEW_TAB : liberator.NEW_BACKGROUND_TAB);
+ },
+ { flags: Mappings.flags.ARGUMENT });
+
+ mappings.add(myModes,
+ ["M"], "Add new QuickMark for current URL",
+ function (arg)
+ {
+ if (/[^a-zA-Z0-9]/.test(arg))
+ {
+ liberator.beep();
+ return;
+ }
+
+ quickmarks.add(arg, buffer.URL);
+ },
+ { flags: Mappings.flags.ARGUMENT });
+
+ /////////////////////////////////////////////////////////////////////////////}}}
+ ////////////////////// COMMANDS ////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+ commands.add(["delqm[arks]"],
+ "Delete the specified QuickMarks",
+ function (args)
+ {
+ // TODO: finish arg parsing - we really need a proper way to do this. :)
+ if (!args.bang && !args.string)
+ {
+ liberator.echoerr("E471: Argument required");
+ return;
+ }
+
+ if (args.bang && args.string)
+ {
+ liberator.echoerr("E474: Invalid argument");
+ return;
+ }
+
+ if (args.bang)
+ quickmarks.removeAll();
+ else
+ quickmarks.remove(args.string);
+ },
+ {
+ bang: true,
+ completer: function (context)
+ {
+ context.title = ["QuickMark", "URL"];
+ context.completions = qmarks;
+ }
+ });
+
+ commands.add(["qma[rk]"],
+ "Mark a URL with a letter for quick access",
+ function (args)
+ {
+ let matches = args.string.match(/^([a-zA-Z0-9])(?:\s+(.+))?$/);
+ if (!matches)
+ liberator.echoerr("E488: Trailing characters");
+ else if (!matches[2])
+ quickmarks.add(matches[1], buffer.URL);
+ else
+ quickmarks.add(matches[1], matches[2]);
+ },
+ { argCount: "+" });
+
+ commands.add(["qmarks"],
+ "Show all QuickMarks",
+ function (args)
+ {
+ args = args.string;
+
+ // ignore invalid qmark characters unless there are no valid qmark chars
+ if (args && !/[a-zA-Z0-9]/.test(args))
+ {
+ liberator.echoerr("E283: No QuickMarks matching \"" + args + "\"");
+ return;
+ }
+
+ let filter = args.replace(/[^a-zA-Z0-9]/g, "");
+ quickmarks.list(filter);
+ });
+
+ /////////////////////////////////////////////////////////////////////////////}}}
+ ////////////////////// PUBLIC SECTION //////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+ return {
+
+ add: function add(qmark, location)
+ {
+ qmarks.set(qmark, location);
+ liberator.echomsg("Added Quick Mark '" + qmark + "': " + location, 1);
+ },
+
+ remove: function remove(filter)
+ {
+ let pattern = RegExp("[" + filter.replace(/\s+/g, "") + "]");
+
+ for (let [qmark,] in qmarks)
+ {
+ if (pattern.test(qmark))
+ qmarks.remove(qmark);
+ }
+ },
+
+ removeAll: function removeAll()
+ {
+ qmarks.clear();
+ },
+
+ jumpTo: function jumpTo(qmark, where)
+ {
+ let url = qmarks.get(qmark);
+
+ if (url)
+ liberator.open(url, where);
+ else
+ liberator.echoerr("E20: QuickMark not set");
+ },
+
+ list: function list(filter)
+ {
+ let marks = [k for ([k, v] in qmarks)];
+ let lowercaseMarks = marks.filter(function (x) /[a-z]/.test(x)).sort();
+ let uppercaseMarks = marks.filter(function (x) /[A-Z]/.test(x)).sort();
+ let numberMarks = marks.filter(function (x) /[0-9]/.test(x)).sort();
+
+ marks = Array.concat(lowercaseMarks, uppercaseMarks, numberMarks);
+
+ if (marks.length == 0)
+ {
+ liberator.echoerr("No QuickMarks set");
+ return;
+ }
+
+ if (filter.length > 0)
+ {
+ marks = marks.filter(function (qmark) filter.indexOf(qmark) >= 0);
+ if (marks.length == 0)
+ {
+ liberator.echoerr("E283: No QuickMarks matching \"" + filter + "\"");
+ return;
+ }
+ }
+
+ let items = [[mark, qmarks.get(mark)] for ([k, mark] in Iterator(marks))];
+ template.genericTable(items, { title: ["QuickMark", "URL"] });
+ }
+ };
+ //}}}
+}; //}}}
+
+// vim: set fdm=marker sw=4 ts=4 et:
diff --git a/xulmus/content/config.js b/xulmus/content/config.js
new file mode 100755
index 00000000..bd7d145e
--- /dev/null
+++ b/xulmus/content/config.js
@@ -0,0 +1,496 @@
+/***** 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.
+
+Copyright (c) 2006-2009 by 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 *****/
+
+const config = { //{{{
+ /*** required options, no checks done if they really exist, so be careful ***/
+ name: "Xulmus",
+ hostApplication: "Songbird",
+ //mainWindowID: "mainplayer",
+ /*** optional options, there are checked for existence and a fallback provided ***/
+ features: ["bookmarks", "hints", "marks","history", "quickmarks", "session", "tabs", "windows", "player"],
+ defaults: { guioptions: "rb" },
+
+ guioptions: {
+ m: ["Menubar", ["toolbar-menubar"]],
+ T: ["Toolbar", ["nav-bar"]],
+ B: ["Bookmark bar", ["PersonalToolbar"]]
+ },
+
+ //get visualbellWindow() getBrowser().mPanelContainer,
+ get isPlayerWindow() gBrowser.mCurrentTab._tPos == 0,
+ // focusContent() focuses this widget gSongbirdWindowController takes care of the focus.
+ get mainWindowID() "mainplayer",
+ get visualbellWindow() document.getElementById(this.mainWindowID),
+
+ styleableChrome: "chrome://songbird/content/xul/layoutBaseOverlay.xul",
+
+ autocommands: [["BookmarkAdd", "Triggered after a page is bookmarked"],
+ ["ColorScheme", "Triggered after a color scheme has been loaded"],
+ ["DOMLoad", "Triggered when a page's DOM content has fully loaded"],
+ ["DownloadPost", "Triggered when a download has completed"],
+ ["Fullscreen", "Triggered when the browser's fullscreen state changes"],
+ ["LocationChange", "Triggered when changing tabs or when naviagtion to a new location"],
+ ["PageLoadPre", "Triggered after a page load is initiated"],
+ ["PageLoad", "Triggered when a page gets (re)loaded/opened"],
+ ["ShellCmdPost", "Triggered after executing a shell command with :!cmd"],
+ ["XulmusEnter", "Triggered after Xulmus starts"],
+ ["XulmusLeavePre", "Triggered before exiting Xulmus, just before destroying each module"],
+ ["XulmusLeave", "Triggered before exiting Xulmus"]],
+
+ dialogs: [
+ ["about", "About Songbird",
+ function () { window.openDialog("chrome://browser/content/aboutDialog.xul", "_blank", "chrome,dialog,modal,centerscreen"); }],
+ ["addbookmark", "Add bookmark for the current page",
+ function () { PlacesCommandHook.bookmarkCurrentPage(true, PlacesUtils.bookmarksRootId); }],
+ ["addons", "Manage Add-ons",
+ function () { window.BrowserOpenAddonsMgr(); }],
+ ["bookmarks", "List your bookmarks",
+ function () { window.openDialog("chrome://browser/content/bookmarks/bookmarksPanel.xul", "Bookmarks", "dialog,centerscreen,width=600,height=600"); }],
+ ["checkupdates", "Check for updates",
+ function () { window.checkForUpdates(); }],
+ ["cleardata", "Clear private data",
+ function () { Cc[GLUE_CID].getService(Ci.nsIBrowserGlue).sanitize(window || null); }],
+ ["cookies", "List your cookies",
+ function () { window.toOpenWindowByType("Browser:Cookies", "chrome://browser/content/preferences/cookies.xul", "chrome,dialog=no,resizable"); }],
+ ["console", "JavaScript console",
+ function () { window.toJavaScriptConsole(); }],
+ ["customizetoolbar", "Customize the Toolbar",
+ function () { window.BrowserCustomizeToolbar(); }],
+ ["dominspector", "DOM Inspector",
+ function () { try { window.inspectDOMDocument(content.document); } catch (e) { liberator.echoerr("DOM Inspector extension not installed"); } }],
+ ["downloads", "Manage Downloads",
+ function () { window.toOpenWindowByType("Download:Manager", "chrome://mozapps/content/downloads/downloads.xul", "chrome,dialog=no,resizable"); }],
+ ["history", "List your history",
+ function () { window.openDialog("chrome://browser/content/history/history-panel.xul", "History", "dialog,centerscreen,width=600,height=600"); }],
+ ["import", "Import Preferences, Bookmarks, History, etc. from other browsers",
+ function () { window.BrowserImport(); }],
+ ["openfile", "Open the file selector dialog",
+ function () { window.BrowserOpenFileWindow(); }],
+ ["pageinfo", "Show information about the current page",
+ function () { window.BrowserPageInfo(); }],
+ ["pagesource", "View page source",
+ function () { window.BrowserViewSourceOfDocument(content.document); }],
+ ["places", "Places Organizer: Manage your bookmarks and history",
+ function () { PlacesCommandHook.showPlacesOrganizer(ORGANIZER_ROOT_BOOKMARKS); }],
+ ["preferences", "Show Firefox preferences dialog",
+ function () { window.openPreferences(); }],
+ ["printpreview", "Preview the page before printing",
+ function () { PrintUtils.printPreview(onEnterPrintPreview, onExitPrintPreview); }],
+ ["printsetup", "Setup the page size and orientation before printing",
+ function () { PrintUtils.showPageSetup(); }],
+ ["print", "Show print dialog",
+ function () { PrintUtils.print(); }],
+ ["saveframe", "Save frame to disk",
+ function () { window.saveFrameDocument(); }],
+ ["savepage", "Save page to disk",
+ function () { window.saveDocument(window.content.document); }],
+ ["searchengines", "Manage installed search engines",
+ function () { window.openDialog("chrome://browser/content/search/engineManager.xul", "_blank", "chrome,dialog,modal,centerscreen"); }],
+ ["selectionsource", "View selection source",
+ function () { buffer.viewSelectionSource(); }]
+ ],
+
+ //TODO : Write intro.html and tutorial.html
+ // they are sorted by relevance, not alphabetically
+ //helpFiles: [ "intro.html" ],
+ /* "intro.html", "tutorial.html", "starting.html", "browsing.html",
+ "buffer.html", "cmdline.html", "insert.html", "options.html",
+ "pattern.html", "tabs.html", "hints.html", "map.html", "eval.html",
+ "marks.html", "repeat.html", "autocommands.html", "print.html",
+ "gui.html", "styling.html", "message.html", "developer.html",
+ "various.html", "index.html", "version.html"
+ ], */
+
+ scripts: [
+ "bookmarks.js",
+ "tabs.js",
+ "player.js",
+ ],
+
+ init: function ()
+ {
+ //Adding a mode for Player
+ //modes.addMode("PLAYER"); // Player mode for songbird
+
+ // var artistArray = getArtists();
+
+ // TODO: support 'nrformats'? -> probably not worth it --mst
+ function incrementURL(count)
+ {
+ let matches = buffer.URL.match(/(.*?)(\d+)(\D*)$/);
+ if (!matches)
+ {
+ liberator.beep();
+ return;
+ }
+
+ let [, pre, number, post] = matches;
+ let newNumber = parseInt(number, 10) + count;
+ let newNumberStr = String(newNumber > 0 ? newNumber : 0);
+ if (number.match(/^0/)) // add 0009<C-a> should become 0010
+ {
+ while (newNumberStr.length < number.length)
+ newNumberStr = "0" + newNumberStr;
+ }
+
+ liberator.open(pre + newNumberStr + post);
+ }
+
+ // load Xulmus specific modules
+ // FIXME: Why aren't these listed in config.scripts?
+ // FIXME: Why isn't this automatic? -> how would one know which classes to load where? --mst
+ // Something like:
+ // liberator.addModule("search", function Search() { ...
+ // for all modules, or something similar. For modules which
+ // require other modules, well, there's addObserver("load_foo",
+ // or we could just make sure that they're all sourced in order.
+ // The scripts could even just instantiate them themselves.
+ // --Kris
+ liberator.loadModule("search", Search);
+ liberator.loadModule("bookmarks", Bookmarks);
+ liberator.loadModule("history", History);
+ liberator.loadModule("tabs", Tabs);
+ liberator.loadModule("marks", Marks);
+ liberator.loadModule("quickmarks", QuickMarks);
+ liberator.loadModule("hints", Hints);
+ // Load the Player module
+ liberator.loadModule("player", Player);
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////// STYLES //////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+ let img = Image();
+ img.src = "chrome://xulmus/content/xulmus.png";
+ img.onload = function () {
+ styles.addSheet(true, "logo", "chrome://liberator/locale/*",
+ ".xulmus-logo {" + <>
+ display: inline-block;
+ background: url({img.src});
+ width: {img.width}px;
+ height: {img.height}px;
+ </> + "}",
+ true);
+ delete img;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////// MAPPINGS ////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+ mappings.add([modes.NORMAL],
+ ["y"], "Yank current location to the clipboard",
+ function () { util.copyToClipboard(buffer.URL, true); });
+
+ // opening websites
+ mappings.add([modes.NORMAL],
+ ["o"], "Open one or more URLs",
+ function () { commandline.open(":", "open ", modes.EX); });
+
+ mappings.add([modes.NORMAL], ["O"],
+ "Open one or more URLs, based on current location",
+ function () { commandline.open(":", "open " + buffer.URL, modes.EX); });
+
+ mappings.add([modes.NORMAL], ["t"],
+ "Open one or more URLs in a new tab",
+ function () { commandline.open(":", "tabopen ", modes.EX); });
+
+ mappings.add([modes.NORMAL], ["t"],
+ "Open one or more URLs in a new tab",
+ function () { commandline.open(":", "tabopen ", modes.EX); });
+
+ mappings.add([modes.NORMAL], ["T"],
+ "Open one or more URLs in a new tab, based on current location",
+ function () { commandline.open(":", "tabopen " + buffer.URL, modes.EX); });
+
+ mappings.add([modes.NORMAL], ["T"],
+ "Open one or more URLs in a new tab, based on current location",
+ function () { commandline.open(":", "tabopen " + buffer.URL, modes.EX); });
+
+ mappings.add([modes.NORMAL],
+ ["<C-a>"], "Increment last number in URL",
+ function (count) { incrementURL(count > 1 ? count : 1); },
+ { flags: Mappings.flags.COUNT });
+
+ mappings.add([modes.NORMAL],
+ ["<C-x>"], "Decrement last number in URL",
+ function (count) { incrementURL(-(count > 1 ? count : 1)); },
+ { flags: Mappings.flags.COUNT });
+
+
+ mappings.add([modes.NORMAL], ["~"],
+ "Open home directory",
+ function () { liberator.open("~"); });
+
+ mappings.add([modes.NORMAL], ["gh"],
+ "Open homepage",
+ function () { BrowserHome(); });
+
+ mappings.add([modes.NORMAL], ["gH"],
+ "Open homepage in a new tab",
+ function ()
+ {
+ let homepages = gHomeButton.getHomePage();
+ liberator.open(homepages, /\bhomepage\b/.test(options["activate"]) ?
+ liberator.NEW_TAB : liberator.NEW_BACKGROUND_TAB);
+ });
+
+
+ mappings.add([modes.NORMAL], ["gu"],
+ "Go to parent directory",
+ function (count)
+ {
+ function isDirectory(url)
+ {
+ if (/^file:\/|^\//.test(url))
+ {
+ let file = io.getFile(url);
+ return file.exists() && file.isDirectory();
+ }
+ else
+ {
+ // for all other locations just check if the URL ends with /
+ return /\/$/.test(url);
+ }
+ }
+
+ if (count < 1)
+ count = 1;
+
+ // XXX
+ let url = buffer.URL;
+ for (let 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 == buffer.URL)
+ liberator.beep();
+ else
+ liberator.open(url);
+ },
+ { flags: Mappings.flags.COUNT });
+
+ mappings.add([modes.NORMAL], ["gU"],
+ "Go to the root of the website",
+ function ()
+ {
+ let uri = content.document.location;
+ if (/(about|mailto):/.test(uri.protocol)) // exclude these special protocols for now
+ {
+ liberator.beep();
+ return;
+ }
+ liberator.open(uri.protocol + "//" + (uri.host || "") + "/");
+ });
+
+ mappings.add([modes.NORMAL], ["<C-l>"],
+ "Redraw the screen",
+ function () { commands.get("redraw").execute("", false); });
+
+ /////////////////////////////////////////////////////////////////////////////}}}
+ ////////////////////// COMMANDS ////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+ commands.add(["downl[oads]", "dl"],
+ "Show progress of current downloads",
+ function ()
+ {
+ liberator.open("chrome://mozapps/content/downloads/downloads.xul",
+ options.get("newtab").has("all", "downloads")
+ ? liberator.NEW_TAB : liberator.CURRENT_TAB);
+ },
+ { argCount: "0" });
+
+ commands.add(["o[pen]", "e[dit]"],
+ "Open one or more URLs in the current tab",
+ function (args)
+ {
+ if (args.string)
+ {
+ liberator.open(args.string);
+ }
+ else if (args.bang)
+ BrowserReloadSkipCache();
+ else
+ BrowserReload();
+ },
+ {
+ bang: true,
+ completer: function (context) completion.url(context),
+ literal: 0
+ });
+
+ commands.add(["pref[erences]", "prefs"],
+ "Show " + config.hostApplication + " preferences",
+ function (args)
+ {
+ if (args.bang) // open Firefox settings GUI dialog
+ {
+ liberator.open("about:config",
+ (options["newtab"] && options.get("newtab").has("all", "prefs"))
+ ? liberator.NEW_TAB : liberator.CURRENT_TAB);
+ }
+ else
+ {
+ window.openPreferences();
+ }
+ },
+ {
+ argCount: "0",
+ bang: true
+ });
+
+ commands.add(["redr[aw]"],
+ "Redraw the screen",
+ function ()
+ {
+ let wu = window.QueryInterface(Ci.nsIInterfaceRequestor).
+ getInterface(Ci.nsIDOMWindowUtils);
+ wu.redraw();
+ modes.show();
+ },
+ { argCount: "0" });
+
+ // TODO: move sidebar commands to ui.js?
+ commands.add(["sbcl[ose]"],
+ "Close the sidebar window",
+ function ()
+ {
+ if (!document.getElementById("sidebar-box").hidden)
+ toggleSidebar();
+ },
+ { argCount: "0" });
+
+ commands.add(["sideb[ar]", "sb[ar]", "sbope[n]"],
+ "Open the sidebar window",
+ function (args)
+ {
+ let arg = args.literalArg;
+
+ // focus if the requested sidebar is already open
+ if (document.getElementById("sidebar-title").value == arg)
+ {
+ document.getElementById("sidebar-box").focus();
+ return;
+ }
+
+ let menu = document.getElementById("viewSidebarMenu");
+
+ for (let [,panel] in Iterator(menu.childNodes))
+ {
+ if (panel.label == arg)
+ {
+ panel.doCommand();
+ return;
+ }
+ }
+
+ liberator.echoerr("No sidebar " + arg + " found");
+ },
+ {
+ argCount: "1",
+ completer: function (context) completion.sidebar(context),
+ literal: 0
+ });
+
+ commands.add(["winc[lose]", "wc[lose]"],
+ "Close window",
+ function () { window.close(); },
+ { argCount: "0" });
+
+ commands.add(["wino[pen]", "wo[pen]", "wine[dit]"],
+ "Open one or more URLs in a new window",
+ function (args)
+ {
+ args = args.string;
+
+ if (args)
+ liberator.open(args, liberator.NEW_WINDOW);
+ else
+ liberator.open("about:blank", liberator.NEW_WINDOW);
+ },
+ {
+ completer: function (context) completion.url(context),
+ literal: 0
+ });
+
+ /////////////////////////////////////////////////////////////////////////////}}}
+ ////////////////////// OPTIONS /////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////{{{
+
+ options.add(["online"],
+ "Set the 'work offline' option",
+ "boolean", true,
+ {
+ setter: function (value)
+ {
+ const ioService = services.get("io");
+ ioService.offline = !value;
+ //gPrefService.setBoolPref("browser.offline", ioService.offline);
+ gPrefs.setBoolPref("browser.offline", ioService.offline);
+ return value;
+ },
+ getter: function () !services.get("io").offline
+ });
+
+ options.add(["titlestring"],
+ "Change the title of the window",
+ "string", "Xulmus",
+ {
+ setter: function (value)
+ {
+ try
+ {
+ let id = this.mainWindowID || "mainplayer";
+ document.getElementById(id).setAttribute("titlemodifier", value);
+ if (window.content.document.title.length > 0)
+ document.title = window.content.document.title + " - " + value;
+ else
+ document.title = value;
+ }
+ catch (e)
+ {
+ liberator.log("Couldn't set titlestring", 3);
+ }
+
+ return value;
+ }
+ });
+
+ options.add(["urlseparator"],
+ "Set the separator regexp used to separate multiple URL args",
+ "string", ",\\s");
+ }
+ //}}}
+}; //}}}
+
+// vim: set fdm=marker sw=4 ts=4 et:
diff --git a/xulmus/content/liberator.dtd b/xulmus/content/liberator.dtd
new file mode 100755
index 00000000..00be4566
--- /dev/null
+++ b/xulmus/content/liberator.dtd
@@ -0,0 +1,6 @@
+
+<!ENTITY liberator.mainWindow "mainplayer">
+<!ENTITY liberator.name "xulmus">
+<!ENTITY liberator.statusBefore "statusbar-display">
+<!ENTITY liberator.statusAfter "">
+
diff --git a/xulmus/content/player.js b/xulmus/content/player.js
new file mode 100755
index 00000000..38d48e63
--- /dev/null
+++ b/xulmus/content/player.js
@@ -0,0 +1,219 @@
+//Import Artist List as this can be huge
+
+var artists = getArtistsArray();
+
+function Player()
+{
+
+ // Get the focus to the visible playlist first
+ //window._SBShowMainLibrary();
+
+ mappings.add([modes.PLAYER],
+ ["x"], "Play Track",
+ function ()
+ {
+ gMM.sequencer.play();
+ });
+
+ mappings.add([modes.PLAYER],
+ ["z"], "Previous Track",
+ function ()
+ {
+ gSongbirdWindowController.doCommand("cmd_control_previous");
+ });
+
+ mappings.add([modes.PLAYER],
+ ["c"], "Pause/Unpause Track",
+ function ()
+ {
+ gSongbirdWindowController.doCommand("cmd_control_playpause");
+ });
+
+ mappings.add([modes.PLAYER],
+ ["b"], "Next Track",
+ function ()
+ {
+ gSongbirdWindowController.doCommand("cmd_control_next");
+ });
+
+ mappings.add([modes.PLAYER],
+ ["v"], "Stop Track",
+ function ()
+ {
+ gMM.sequencer.stop();
+ });
+
+
+ mappings.add([modes.PLAYER],
+ ["l"], "Play Media",
+ function ()
+ {
+ commandline.open(":","playmedia ", modes.EX);
+ });
+
+ mappings.add([modes.PLAYER],
+ ["s"], "Toggle Shuffle",
+ function ()
+ {
+ if (gMM.sequencer.mode != gMM.sequencer.MODE_SHUFFLE)
+ gMM.sequencer.mode = gMM.sequencer.MODE_SHUFFLE;
+ else
+ gMM.sequencer.mode = gMM.sequencer.MODE_FORWARD;
+ });
+
+ mappings.add([modes.PLAYER],
+ ["r"], "Toggle Repeat",
+ function ()
+ {
+ switch(gMM.sequencer.repeatMode)
+ {
+ case gMM.sequencer.MODE_REPEAT_NONE:
+ gMM.sequencer.repeatMode = gMM.sequencer.MODE_REPEAT_ONE;
+ break;
+ case gMM.sequencer.MODE_REPEAT_ONE:
+ gMM.sequencer.repeatMode = gMM.sequencer.MODE_REPEAT_ALL;
+ break;
+ case gMM.sequencer.MODE_REPEAT_ALL:
+ gMM.sequencer.repeatMode = gMM.sequencer.MODE_REPEAT_NONE;
+ break;
+ default:
+ gMM.sequencer.repeatMode = gMM.sequencer.MODE_REPEAT_NONE;
+ break;
+ }
+ });
+
+ commands.add(["playmedia"],
+ "PLay Media",
+ function(args)
+ {
+ //Store the old view
+ //var prev_view = gMM.status.view;
+ var library = LibraryUtils.mainLibrary;
+ var mainView = library.createView();
+ var sqncr = gMM.sequencer;
+ var customProps = Cc["@songbirdnest.com/Songbird/Properties/MutablePropertyArray;1"]
+ .createInstance(Ci.sbIMutablePropertyArray);
+
+ //args
+
+ if (args.length == 1){
+ customProps.appendProperty(SBProperties.artistName,args[0].toString());
+ }
+ else if (args.length == 2){
+ customProps.appendProperty(SBProperties.artistName,args[0].toString());
+ customProps.appendProperty(SBProperties.albumName,args[1].toString());
+ }
+ else if (args.length == 3){
+ customProps.appendProperty(SBProperties.artistName,args[0].toString());
+ customProps.appendProperty(SBProperties.albumName,args[1].toString());
+ customProps.appendProperty(SBProperties.trackName,args[2].toString());
+ }
+
+
+ sqncr.playView(mainView, mainView.getIndexForItem(library.getItemsByProperties(customProps).queryElementAt(0,Ci.sbIMediaItem)));
+
+
+ },
+ {
+ completer: function(context, args) completion.songCompletion(context, args)
+ });
+
+
+
+}
+
+function getArtists()
+{
+ return this.artists;
+}
+
+function getArtistsArray()
+{
+
+ var list = LibraryUtils.mainLibrary;
+
+ // Create an enumeration listener to count each item
+ var listener = {
+ count: 0,
+ onEnumerationBegin: function(aMediaList) {
+ this.count = 0;
+ },
+ onEnumeratedItem: function(aMediaList, aMediaItem) {
+ this.count++;
+ },
+ onEnumerationEnd: function(aMediaList, aStatusCode) {}
+ };
+
+ var artistCounts = {};
+ var artists = list.getDistinctValuesForProperty(SBProperties.artistName);
+ var artist;
+ var artistArray = [];
+ var i=0;
+ // Count the number of media items for each distinct artist
+ while (artists.hasMore()) {
+ artist = artists.getNext();
+ artistArray[i] = [artist,artist];
+ list.enumerateItemsByProperty(SBProperties.artistName,
+ artist,
+ listener,
+ Ci.sbIMediaList.ENUMERATIONTYPE_LOCKING);
+ artistCounts[artist] = listener.count;
+ i++;
+ }
+
+ //liberator.dump("Count : "+artistCounts.toSource());
+ return artistArray;
+}
+
+function getAlbums(artist)
+{
+ var list = LibraryUtils.mainLibrary;
+ var albumArray = [];
+ var items = list.getItemsByProperty(SBProperties.artistName, artist).enumerate();
+ var i = 0;
+
+ while(items.hasMoreElements()) {
+ album = items.getNext().getProperty(SBProperties.albumName);
+ albumArray[i] = [album, album];
+ i++;
+ }
+
+ return removeDuplicateElement(albumArray);
+}
+
+function getTracks(artist,album)
+{
+ var list = LibraryUtils.mainLibrary;
+ var tracksArray = [];
+ var pa = Cc["@songbirdnest.com/Songbird/Properties/MutablePropertyArray;1"]
+ .createInstance(Ci.sbIMutablePropertyArray);
+ var i = 0;
+
+ pa.appendProperty(SBProperties.artistName,artist.toString());
+ pa.appendProperty(SBProperties.albumName,album.toString());
+ var items = list.getItemsByProperties(pa).enumerate();
+
+ while(items.hasMoreElements()) {
+ track = items.getNext().getProperty(SBProperties.trackName);
+ tracksArray[i] = [track, track];
+ i++;
+ }
+
+ return tracksArray;
+}
+
+
+function removeDuplicateElement(arrayName)
+{
+ var newArray=new Array();
+label:for(var i=0; i<arrayName.length;i++ )
+ {
+ for(var j=0; j<newArray.length;j++ )
+ {
+ if(newArray[j].toString()==arrayName[i].toString())
+ continue label;
+ }
+ newArray[newArray.length] = arrayName[i];
+ }
+ return newArray;
+}
diff --git a/xulmus/content/xulmus.png b/xulmus/content/xulmus.png
new file mode 100755
index 00000000..52ff0c8d
--- /dev/null
+++ b/xulmus/content/xulmus.png
Binary files differ
diff --git a/xulmus/content/xulmus.svg b/xulmus/content/xulmus.svg
new file mode 100755
index 00000000..7e2983ed
--- /dev/null
+++ b/xulmus/content/xulmus.svg
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="162"
+ height="40"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ version="1.0"
+ sodipodi:docbase="/home/maxauthority/code/vimperator"
+ sodipodi:docname="vimperator.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/maxauthority/code/vimperator/vimperator.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs4">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 29 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="185 : 29 : 1"
+ inkscape:persp3d-origin="92.5 : 19.333333 : 1"
+ id="perspective2392" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.04"
+ inkscape:cx="84.114858"
+ inkscape:cy="55.052209"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ width="185px"
+ height="58px"
+ showgrid="false" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-5.4392018,-9.6624603)">
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:DejaVu Sans Mono"
+ x="6.2673268"
+ y="29.896835"
+ id="text2229"><tspan
+ sodipodi:role="line"
+ id="tspan2231"
+ x="6.2673268"
+ y="29.896835">vimperator_</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:DejaVu Sans Mono"
+ x="6.4079518"
+ y="53.183945"
+ id="text2233"><tspan
+ sodipodi:role="line"
+ id="tspan2235"
+ x="6.4079518"
+ y="53.183945">~</tspan></text>
+ </g>
+</svg>
diff --git a/xulmus/content/xulmus.xul b/xulmus/content/xulmus.xul
new file mode 100755
index 00000000..c2065005
--- /dev/null
+++ b/xulmus/content/xulmus.xul
@@ -0,0 +1,52 @@
+<?xml version="1.0"?>
+
+<?xml-stylesheet href="chrome://browser/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://xulmus/skin/xulmus.css" type="text/css"?>
+
+<overlay id="xulmus"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:nc="http://home.netscape.com/NC-rdf#"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+ <menupopup id="viewSidebarMenu">
+ <menuitem observes="xulmus-viewAddonsSidebar" label="Add-ons" accesskey="A"/>
+ <menuitem observes="xulmus-viewConsoleSidebar" label="Console" accesskey="C"/>
+ <menuitem observes="xulmus-viewDownloadsSidebar" label="Downloads" accesskey="D"/>
+ <menuitem observes="xulmus-viewPreferencesSidebar" label="Preferences" accesskey="P"/>
+ </menupopup>
+
+ <broadcasterset id="mainBroadcasterSet">
+ <broadcaster id="xulmus-viewAddonsSidebar"
+ autoCheck="false"
+ type="checkbox"
+ group="sidebar"
+ sidebarurl="chrome://mozapps/content/extensions/extensions.xul"
+ sidebartitle="Add-ons"
+ oncommand="toggleSidebar('xulmus-viewAddonsSidebar');"/>
+ <broadcaster id="xulmus-viewConsoleSidebar"
+ autoCheck="false"
+ type="checkbox"
+ group="sidebar"
+ sidebarurl="chrome://global/content/console.xul"
+ sidebartitle="Console"
+ oncommand="toggleSidebar('xulmus-viewConsoleSidebar');"/>
+ <broadcaster id="xulmus-viewDownloadsSidebar"
+ autoCheck="false"
+ type="checkbox"
+ group="sidebar"
+ sidebarurl="chrome://mozapps/content/downloads/downloads.xul"
+ sidebartitle="Downloads"
+ oncommand="toggleSidebar('xulmus-viewDownloadsSidebar');"/>
+ <broadcaster id="xulmus-viewPreferencesSidebar"
+ autoCheck="false"
+ type="checkbox"
+ group="sidebar"
+ sidebarurl="about:config"
+ sidebartitle="Preferences"
+ oncommand="toggleSidebar('xulmus-viewPreferencesSidebar');"/>
+ </broadcasterset>
+
+</overlay>
+
+<!-- vim: set fdm=marker sw=4 ts=4 et: -->
diff --git a/xulmus/contrib/vim/Makefile b/xulmus/contrib/vim/Makefile
new file mode 100755
index 00000000..e2f716f5
--- /dev/null
+++ b/xulmus/contrib/vim/Makefile
@@ -0,0 +1,9 @@
+VIMBALL = vimperator.vba
+
+vimball: mkvimball.txt syntax/vimperator.vim ftdetect/vimperator.vim
+ -echo '%MkVimball! ${VIMBALL} .' | vim -u NORC -N -e -s mkvimball.txt
+
+all: vimball
+
+clean:
+ rm -f ${VIMBALL}
diff --git a/xulmus/contrib/vim/ftdetect/vimperator.vim b/xulmus/contrib/vim/ftdetect/vimperator.vim
new file mode 100755
index 00000000..cbf9068e
--- /dev/null
+++ b/xulmus/contrib/vim/ftdetect/vimperator.vim
@@ -0,0 +1 @@
+au BufNewFile,BufRead *vimperatorrc*,*.vimp set filetype=vimperator
diff --git a/xulmus/contrib/vim/mkvimball.txt b/xulmus/contrib/vim/mkvimball.txt
new file mode 100755
index 00000000..96d1629b
--- /dev/null
+++ b/xulmus/contrib/vim/mkvimball.txt
@@ -0,0 +1,2 @@
+syntax/vimperator.vim
+ftdetect/vimperator.vim
diff --git a/xulmus/contrib/vim/syntax/vimperator.vim b/xulmus/contrib/vim/syntax/vimperator.vim
new file mode 100755
index 00000000..aebd6fc1
--- /dev/null
+++ b/xulmus/contrib/vim/syntax/vimperator.vim
@@ -0,0 +1,104 @@
+" Vim syntax file
+" Language: VIMperator configuration file
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2009 Feb 19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn include @javascriptTop syntax/javascript.vim
+unlet b:current_syntax
+
+syn include @cssTop syntax/css.vim
+unlet b:current_syntax
+
+syn match vimperatorCommandStart "\%(^\s*:\=\)\@<=" nextgroup=vimperatorCommand,vimperatorAutoCmd
+
+syn keyword vimperatorCommand ab[breviate] ab[clear] addo[ns] bN[ext] b[uffer] ba[ck] bd[elete] beep bf[irst] bl[ast] bma[rk]
+ \ bmarks bn[ext] bp[revious] br[ewind] buffers bun[load] bw[ipeout] ca[bbrev] cabc[lear] cd chd[ir] cm[ap] cmapc[lear]
+ \ cno[remap] colo[rscheme] com[mand] comc[lear] cu[nmap] cuna[bbrev] delbm[arks] delc[ommand] delm[arks] delmac[ros]
+ \ delqm[arks] dels[tyle] dia[log] dl do[autocmd] doautoa[ll] downl[oads] e[dit] ec[ho] echoe[rr] echom[sg] em[enu] exe[cute]
+ \ exu[sage] files fini[sh] fo[rward] fw h[elp] ha[rdcopy] hi[ghlight] hist[ory] hs ia[bbrev] iabc[lear] im[ap] imapc[lear]
+ \ ino[remap] iu[nmap] iuna[bbrev] javas[cript] js ju[mps] let loadplugins lpl ls ma[rk] macros map mapc[lear] marks mes[sages]
+ \ mkv[imperatorrc] no[remap] noh[lsearch] norm[al] o[pen] optionu[sage] pa[geinfo] pagest[yle] pc[lose] pl[ay] pref[erences]
+ \ prefs pw[d] q[uit] qa[ll] qma[rk] qmarks quita[ll] re[draw] re[load] reloada[ll] res[tart] run runt[ime] sav[eas] sb[ar]
+ \ sb[open] sbcl[ose] scrip[tnames] se[t] setg[lobal] setl[ocal] sideb[ar] so[urce] st[op] sty[le] tN[ext] t[open] tab
+ \ tabN[ext] tabc[lose] tabd[uplicate] tabde[tach] tabe[dit] tabfir[st] tabl[ast] tabm[ove] tabn[ext] tabnew tabo[nly] tabopen
+ \ tabp[revious] tabr[ewind] tabs time tn[ext] tp[revious] u[ndo] una[bbreviate] undoa[ll] unl[et] unm[ap] ve[rsion]
+ \ vie[wsource] viu[sage] w[rite] wc[lose] win[open] winc[lose] wine[dit] wo[pen] wq wqa[ll] xa[ll] zo[om]
+ \ contained
+
+syn match vimperatorCommand "!" contained
+
+syn keyword vimperatorAutoCmd au[tocmd] contained nextgroup=vimperatorAutoEventList skipwhite
+
+syn keyword vimperatorAutoEvent BookmarkAdd DOMLoad LocationChange PageLoadPre PageLoad ShellCmdPost VimperatorEnter
+ \ VimperatorLeavePre VimperatorLeave
+ \ contained
+
+syn match vimperatorAutoEventList "\(\a\+,\)*\a\+" contained contains=vimperatorAutoEvent
+
+syn region vimperatorSet matchgroup=vimperatorCommand start="\%(^\s*:\=\)\@<=\<\%(setl\%[ocal]\|setg\%[lobal]\|set\=\)\=\>"
+ \ end="$" keepend oneline contains=vimperatorOption,vimperatorString
+
+syn keyword vimperatorOption activate act cdpath cd complete cpt defsearch ds editor eventignore ei extendedhinttags eht
+ \ followhints fh guioptions go helpfile hf hintmatching hm hinttags ht hinttimeout hto history hi laststatus ls messages msgs
+ \ newtab nextpattern pageinfo pa popups pps previouspattern runtimepath rtp scroll scr shell sh shellcmdflag shcf
+ \ showstatuslinks ssli showtabline stal suggestengines titlestring urlseparator verbose vbs wildcase wic wildignore wig
+ \ wildmode wim wildoptions wop wordseparators wsp
+ \ contained nextgroup=vimperatorSetMod
+
+" toggle options
+syn match vimperatorOption "\<\%(no\|inv\)\=\%(errorbells\|eb\|exrc\|ex\|focuscontent\|fc\|fullscreen\|fs\|ignorecase\|ic\)\>!\="
+ \ contained nextgroup=vimperatorSetMod
+syn match vimperatorOption "\<\%(no\|inv\)\=\%(incsearch\|is\|insertmode\|im\|hlsearch\|hls\|linksearch\|lks\)\>!\="
+ \ contained nextgroup=vimperatorSetMod
+syn match vimperatorOption "\<\%(no\|inv\)\=\%(loadplugins\|lpl\|more\|online\|preload\|showmode\|smd\|smartcase\|scs\)\>!\="
+ \ contained nextgroup=vimperatorSetMod
+syn match vimperatorOption "\<\%(no\|inv\)\=\%(online\|visualbell\|vb\|usermode\|um\)\>!\="
+ \ contained nextgroup=vimperatorSetMod
+
+syn match vimperatorSetMod "\%(\<[a-z_]\+\)\@<=&" contained
+
+syn region vimperatorJavaScript start="\%(^\s*\%(javascript\|js\)\s\+\)\@<=" end="$" contains=@javascriptTop keepend oneline
+syn region vimperatorJavaScript matchgroup=vimperatorJavascriptDelimiter
+ \ start="\%(^\s*\%(javascript\|js\)\s\+\)\@<=<<\s*\z(\h\w*\)"hs=s+2 end="^\z1$" contains=@javascriptTop fold
+
+let s:cssRegionStart = '\%(^\s*sty\%[le]!\=\s\+\%(-\%(n\|name\)\%(\s\+\|=\)\S\+\s\+\)\=[^-]\S\+\s\+\)\@<='
+execute 'syn region vimperatorCss start="' . s:cssRegionStart . '" end="$" contains=@cssTop keepend oneline'
+execute 'syn region vimperatorCss matchgroup=vimperatorCssDelimiter'
+ \ 'start="' . s:cssRegionStart . '<<\s*\z(\h\w*\)"hs=s+2 end="^\z1$" contains=@cssTop fold'
+
+syn match vimperatorNotation "<[0-9A-Za-z-]\+>"
+
+syn match vimperatorComment +".*$+ contains=vimperatorTodo,@Spell
+syn keyword vimperatorTodo FIXME NOTE TODO XXX contained
+
+syn region vimperatorString start="\z(["']\)" end="\z1" skip="\\\\\|\\\z1" oneline
+
+syn match vimperatorLineComment +^\s*".*$+ contains=vimperatorTodo,@Spell
+
+" NOTE: match vim.vim highlighting group names
+hi def link vimperatorAutoCmd vimperatorCommand
+hi def link vimperatorAutoEvent Type
+hi def link vimperatorCommand Statement
+hi def link vimperatorComment Comment
+hi def link vimperatorJavascriptDelimiter Delimiter
+hi def link vimperatorCssDelimiter Delimiter
+hi def link vimperatorNotation Special
+hi def link vimperatorLineComment Comment
+hi def link vimperatorOption PreProc
+hi def link vimperatorSetMod vimperatorOption
+hi def link vimperatorString String
+hi def link vimperatorTodo Todo
+
+let b:current_syntax = "vimperator"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: tw=130 et ts=4 sw=4:
diff --git a/xulmus/install.rdf b/xulmus/install.rdf
new file mode 100755
index 00000000..68e17ae6
--- /dev/null
+++ b/xulmus/install.rdf
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#"
+ xmlns:songbird="http://www.songbirdnest.com/2007/addon-metadata-rdf#">
+ <Description about="urn:mozilla:install-manifest">
+ <em:id>{3703dcdb-6ba3-4331-8de8-c18373fb05d1}</em:id>
+ <em:type>2</em:type>
+ <em:name>xulmus@vimperator.org</em:name>
+ <em:version>0.1</em:version>
+ <em:creator>Prathyush Thota</em:creator>
+
+
+ <em:description>VIM for SongBird brothers.</em:description>
+
+
+
+
+
+
+
+ <em:targetApplication>
+ <Description>
+ <em:id>songbird@songbirdnest.com</em:id>
+ <em:minVersion>0.8.0pre</em:minVersion>
+ <em:maxVersion>1.1.0pre</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+
+
+
+
+
+ <!-- Register a pane to be displayed below the service sidebar.
+ See http://wiki.songbirdnest.com/Developer/Articles/Getting_Started/Display_Panes -->
+ <songbird:displayPane>
+ <Description>
+ <songbird:contentTitle>xulmus</songbird:contentTitle>
+ <songbird:contentUrl>chrome://xulmus/content/pane.xul</songbird:contentUrl>
+ <songbird:contentIcon>chrome://xulmus/skin/pane-icon.png</songbird:contentIcon>
+ <songbird:defaultWidth>200</songbird:defaultWidth>
+ <songbird:defaultHeight>100</songbird:defaultHeight>
+ <songbird:suggestedContentGroups>servicepane</songbird:suggestedContentGroups>
+ <songbird:showOnInstall>true</songbird:showOnInstall>
+ </Description>
+ </songbird:displayPane>
+
+
+
+ <!-- Register a custom media page.
+ See http://wiki.songbirdnest.com/Developer/Articles/Getting_Started/Building_Media_Views -->
+ <songbird:mediaPage>
+ <Description>
+ <songbird:contentTitle>xulmus</songbird:contentTitle>
+ <songbird:contentUrl>chrome://xulmus/content/media-page.xul</songbird:contentUrl>
+ </Description>
+ </songbird:mediaPage>
+
+ </Description>
+</RDF>
diff --git a/xulmus/locale/en-US/Makefile b/xulmus/locale/en-US/Makefile
new file mode 100755
index 00000000..627ca99b
--- /dev/null
+++ b/xulmus/locale/en-US/Makefile
@@ -0,0 +1,2 @@
+BASE = ../../../common
+include $(BASE)/Makefile.doc
diff --git a/xulmus/locale/en-US/asciidoc.conf b/xulmus/locale/en-US/asciidoc.conf
new file mode 100755
index 00000000..4bcc4288
--- /dev/null
+++ b/xulmus/locale/en-US/asciidoc.conf
@@ -0,0 +1,86 @@
+[miscellaneous]
+
+[glossary]
+author=Martin Stubenschrott
+email=stubenschrott@gmx.net
+
+[header]
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="{lang=en}">
+ <head>
+ <meta http-equiv="Content-Type" content="application/xhtml+xml; charset={encoding=UTF-8}" />
+ <meta name="generator" content="AsciiDoc {asciidoc-version}" />
+ <link rel="stylesheet" href="xhtml11.css" type="text/css" />
+ <link rel="icon" href="chrome://vimperator/skin/icon.png" type="image/png" />
+ <script type="application/x-javascript;version=1.8" src="help.js"></script>
+ <title>{doctitle}</title>
+ </head>
+<body>
+<h1 style="font-size: inherit; text-align: right;">
+ <span class="tag" style="float: none;">{doctitle}</span>
+</h1>
+
+[replacements]
+LOGO=<div style="text-align: center;"><span class="vimperator-logo"></span></div>
+HEADER=<div style="float: right; padding-left: 1px;"> <form action="https://www.paypal.com/cgi-bin/webscr" method="post"> <fieldset class="paypal"> <input type="hidden" name="cmd" value="_s-xclick"/> <input type="image" src="data:image/gif;base64,R0lGODlhbgAXAPcDAP/WmP+oIv+sLMwAAP/Tjk1QVf/Og/+9WCA8aIhtRP/Xmf/LgP+9WU1VY//dqWpgUCA6Yv/Ogltlck1bcE1ZbaZ8PC9CX5d1QFtjb+GZK9UiE/+oIf/Tj3lmSFtXUcSaXD5JWWpfTT5JW9KVN4iDesSLM9KSL9KaRP+eDv/kuy9BXv+hFOG/ifDEgS9GayA6YyA9aT5QbS9GavDJi1teYmptcT5Qa1tYVPC0WvChJohvSSA7ZfCqP+G7f5eNfPDQnXlvYLWhgcSnfLWGPsSOO3l5d9KjW7WdeoiGg4h4X8SSR//boz5MY7WjiP+5Ty9Hbf/CZXl6fFtldeGiQeGdM/+5Tnl2cv+tLnl2c6aJXv/gr+GsWv+sK2pvdf/mwXl8gKZ+QvCkMP+9V9K1hv/Mfv/hs//cppeAX8Swki9EZP+zQv/OgWpmYZeOgoiAdP/kuf2rQP+mIf+0Rf6zSf/BY/+xO/7AaYiEf01bcqaXf//Id6aZhvDNltcmD/+zQf+kHoh4YLWSXf/Phf+nI/++Xv6gGv+2RpeNfZeAXv6hGv6iGYiFf/+qLf2cFP/eq7Wmjk1cc/7Cbf7LfpeKdv/Wl+G/iv+jGf+sLf/Wlf/VlP2yTv+iFeHFmv/Ynf+lIf+uNP/Znv+vOf66WP6wQj5Qbs4FAk1RWP/BZ/+gEf/Ukv/AYv/PhNAWFP7Lff6jIf+sLv+yO/+wOf+lHmpweaaUeP/erKaZhf+2Rf/Mff/dp/+6UmpxfP+mIP/Ri//juP60SaaJXf+oJv++Xf/jt//Vlv+iGP/aof7Lf/+yPP/eqv/frf7Db//mv//kuv/nwf/hsv/DZ//Xm/+6UP/NfxIzZveXOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAMALAAAAABuABcAAAj/AAcIHFCtoMGDCBMqXMiwocOHEB0OHFjtD6FWxzJqPLZg48aOGheA9BiSpMmTH0tmHLkSZUuUHSWdYlSN4i9Kw5jp3Mmzp8+fQIMKHUq0aNA3ZkTVHKAolbOnUKM+9SK1qtWrWLNq3Up1K9YlngjK8tWsrNmzaMumSMu2bbO1btXGnYsWLt24agqq0fKsr9+/fcsAHky4sOHDiBMLTmxYC52Ccswkm0y5suXJDiw7yHy5s+fKmz9zFo35s+nOuVQV9NPJmOvXrzlRo4bEGJrZtWG7fkJNt+/XP3jnfv1oNjUYX34r//3jy4/bu5ZLNwZKWMFYmABoB6BAuwIFtmbf/wEgZXaT7d8B8KGGp/v29/AXzZbiXnsUarOiwKDWBn73+vC9pwAMMADQBCR7BCigf+kRo0tBcaxCwIQUTshBEbNNwIJxY8zQhQukHEJAENSQkMcEEsxQBAIukEAABxRWwiICMVRIwATUjDEiNRNwwMKKEgThI4oxIODiDBLQ6AMBElBjJAkazuCDCzEsSUAXKFIjgYUwUijIJwWhUAUZa0RggAERmBkBBQjIQEEN1MhAjQEYUIOFDdT04AY1ddrQwyR81nnEmWjCSQsFcxIagZNntkANBUI4aQUCCLRwxGxYIDAnolbI2UOdkMrZgqY14HmEo3wiKoSiEaxBhhMrhP+5wRW3iHHArQwwcAA1DTTABK9pNHDAFmfQsAM1ODRgHA4H/AoEENQkoSsDRlCzwwfKGoFrtQ3k+gE1bNBADTAHAEJNFklQc8YBaVDDwBaIGEvNAekGggOvWVBDwwHfsvFtt9B+cMC0YhhyxQaxVoPCBgE07HDDJlCTQAGzDUFNCBlQA4EH1KgQAAQaUzNEABoXYHIFDlNsHDUlOFyBxA1TfAHFGQTAsQk050BNARlDEELHAVCcQwnUdJAANRcEcAHSR6MMAjUPP4ywrFG7LDLFKlh8wdJG75xxARGHsEEBEJRgcs0BWAxCAgn8nIDDP3swMTUgBNBB0UfXDTTRXbP/TY0HH7PctMUFVAByDjeTXHfVAUxdDSpcCCD55JI/QM0IplADhg7UEEHFC9RYQM0DYFCjgwAWvCDAEKKPLjkXoo8gORGuSy7Cyg+EIUAYt1Nzwwgj+C4A50N8Hrrrt4tww+VcWE6NCEOgrjrtD1BOOReWFFRMHch07/334HvPgxLhh38CD+Wnrz4yJ0yx/vjgK3EC+FPMv374sAxSEC9VSOP//wAMoAAHSMACGvCACExgAp3wioIEAwrQiKAEJ0jBClrwghjMoAY3yEEOQiEUBdkELqZBwhKa8IQoTKEKV8jCFrrwhTC8RE0aoYdo2PCGOMyhDnfIwx768IdADGIQUg2QCIFUAw69MIYjlMHEJjrxiVCMohSnSMUqWvGKUazFEjKhiaUQpBCjsMMyxkjGMprxjGhMoxrXyMY2uhGNkZiDK7xIkYjY8Y54zKMeCzKRgAAAOw==" name="submit" alt="Make payments with PayPal - it's fast, free and secure!"/> <input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----MIIHPwYJKoZIhvcNAQcEoIIHMDCCBywCAQExggEwMIIBLAIBADCBlDCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20CAQAwDQYJKoZIhvcNAQEBBQAEgYBDDJfc+lXLBSAM9XSWv/ebzG/L7PTqYiIXaWVg8pfinDsfYaAcifcgCTuApg4v/VaZIQ/hLODzQu2EvmjGXP0twErA/Q8G5gx0l197PJSyVXb1sLwd1mgOdLF4t0HmDCdEI9z3H6CMhsb3xVwlfpzllSfCIqzlSpx4QtdzEZGzLDELMAkGBSsOAwIaBQAwgbwGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQI8ZOwn5QkHgaAgZjjtPQxB7Vw2rS7Voap9y+xdVLoczUQ97hw+bOdZLcGykBtfoVjdn76MS51QKjGp1fEmxkqTuQ+Fxv8+OVtHu0QF/qlrhmC3fJBRJ0IFWxKdXS+Wod4615BDaG2X1hzvCL443ffka8XlLSiFTuW43BumQs/O+6Jqsk2hcReP3FIQOvtWMSgGTALnZx7x5c60u/3NSKW5qvyWKCCA4cwggODMIIC7KADAgECAgEAMA0GCSqGSIb3DQEBBQUAMIGOMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC1BheVBhbCBJbmMuMRMwEQYDVQQLFApsaXZlX2NlcnRzMREwDwYDVQQDFAhsaXZlX2FwaTEcMBoGCSqGSIb3DQEJARYNcmVAcGF5cGFsLmNvbTAeFw0wNDAyMTMxMDEzMTVaFw0zNTAyMTMxMDEzMTVaMIGOMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC1BheVBhbCBJbmMuMRMwEQYDVQQLFApsaXZlX2NlcnRzMREwDwYDVQQDFAhsaXZlX2FwaTEcMBoGCSqGSIb3DQEJARYNcmVAcGF5cGFsLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwUdO3fxEzEtcnI7ZKZL412XvZPugoni7i7D7prCe0AtaHTc97CYgm7NsAtJyxNLixmhLV8pyIEaiHXWAh8fPKW+R017+EmXrr9EaquPmsVvTywAAE1PMNOKqo2kl4Gxiz9zZqIajOm1fZGWcGS0f5JQ2kBqNbvbg2/Za+GJ/qwUCAwEAAaOB7jCB6zAdBgNVHQ4EFgQUlp98u8ZvF71ZP1LXChvsENZklGswgbsGA1UdIwSBszCBsIAUlp98u8ZvF71ZP1LXChvsENZklGuhgZSkgZEwgY4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLUGF5UGFsIEluYy4xEzARBgNVBAsUCmxpdmVfY2VydHMxETAPBgNVBAMUCGxpdmVfYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwuY29tggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAgV86VpqAWuXvX6Oro4qJ1tYVIT5DgWpE692Ag422H7yRIr/9j/iKG4Thia/Oflx4TdL+IFJBAyPK9v6zZNZtBgPBynXb048hsP16l2vi0k5Q2JKiPDsEfBhGI+HnxLXEaUWAcVfCsQFvd2A1sxRr67ip5y2wwBelUecP3AjJ+YcxggGaMIIBlgIBATCBlDCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20CAQAwCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTA3MDMyMTIyMzI1OFowIwYJKoZIhvcNAQkEMRYEFCirrvlwYVHQiNEEbM6ikfx9+Dm5MA0GCSqGSIb3DQEBAQUABIGAtbsR8GdCdURLziozXLSdtY+zJZUPPeQFXXy2V1S/3ldiN+pRvd4HI7xz8mOY1UaKJZpwZnOosy9MflL1/hbiEtEyQ2Dm/s4jnTcJng/NjLIZu+0NYxXRJhB+zMJubnMMMjzNrGlqI4F2HAB/bCA1eOJ5B83Of3dA4rk/T/8GoSQ=-----END PKCS7-----"/> </fieldset> </form> </div> <span class="vimperator-logo"></span>
+\[count\]=<span class="argument">&#91;count&#93;</span>
+\[!\]=<span class="argument">&#91;!&#93;</span>
+
+[macros]
+# section:Introduction[tag1,tag2]
+(?su)(?<!\S)[\\]?\|(?P<attrlist>.+?)\|(?!\+)=section
+# help:helptext[href]
+(?su)(?<!\S)[\\]?\|(?P<attrlist>.+?)\|(?!\+)=help
+
+# maximum 3 tags for now
+[section-inlinemacro]
+<table style="border-bottom: 1px solid silver; width: 100%">
+<tr style="width: 100%"><td style="width: 50%"><h2>{target}</h2></td><td style="width: 50%">
+{3? <a id="{3}"/><span class="tag">{3}</span>}
+{2? <a id="{2}"/><span class="tag">{2}</span>}
+{1? <a id="{1}"/><span class="tag">{1}</span>}
+</td></tr>
+</table>
+
+[help-inlinemacro]
+<a href="chrome://liberator/locale/{1}">{target}</a>
+
+[quotes]
+|=tag
+||=key
+[o]=#option
+'=option2
+[c]=#command
+[m]=#mapping
+[a]=#argument
+# FIXME: this prevents all asciidoc attribute processing
+# ^obviously it doesn't? --stepnem
+{|}=argument2
+# disable monospaced text as all our text is monospaced and it causes problems for some things
++=
+^=
+
+[tags]
+tag=<span class="tag">|</span>
+key=<div class="key">|</div>
+option=<a class="option" href="#">|</a>
+option2=<a class="option" href="#">'|'</a>
+command=<a class="command" href="#">|</a>
+mapping=<a class="mapping" href="#">|</a>
+argument=<span class="argument">|</span>
+# NOTE: in certain contexts the unescaped '#' is stripped. As we're ditching
+# asciidoc I won't bother investigating --djk
+argument2=<span class="argument">&\#123;|&#125;</span>
+argument3=<span class="argument">[|]</span>
+
+[specialwords]
+warningwords=WARNING: Warning: IMPORTANT: Important:
+infowords=NOTE: Note:
+
+[warningwords]
+<span class="warning">{words}</span>
+
+[infowords]
+<span class="info">{words}</span>
diff --git a/xulmus/locale/en-US/autocommands.txt b/xulmus/locale/en-US/autocommands.txt
new file mode 100755
index 00000000..36104b56
--- /dev/null
+++ b/xulmus/locale/en-US/autocommands.txt
@@ -0,0 +1,91 @@
+HEADER
+
+|autocommands| +
+
+Autocommands are a way to automatically execute code when certain events
+happen.
+
+|:au| |:autocmd| +
+||:au[tocmd]||
+________________________________________________________________________________
+Execute commands automatically on events.
+
+[c]:au[tocmd][c] {event} {pat} {cmd}
+
+Add {cmd} to the list of commands Vimperator will execute on {event} for a URL matching {pat}:
+
+* [c]:autocmd[!][c] {events} {pat}: list/remove autocommands filtered by {events} and {pat}
+* [c]:autocmd[!][c] {events}: list/remove autocommands matching {events}
+* [c]:autocmd[!][c] * {pat}: list/remove autocommands matching {pat}
+* [c]:autocmd[!][c]: list/remove all autocommands
+
+Available {events}:
+
+`--------------------`----------------------------------------
+*BookmarkAdd* Triggered after a page is bookmarked
+*ColorScheme* Triggered after a color scheme has been loaded
+*DOMLoad* Triggered when a page's DOM content has fully loaded
+*DownloadPost* Triggered when a download has completed
+*Fullscreen* Triggered when the browser's fullscreen state changes
+*LocationChange* Triggered when changing tabs or when navigating to a new location
+*PageLoadPre* Triggered after a page load is initiated
+*PageLoad* Triggered when a page gets (re)loaded/opened
+*ShellCmdPost* Triggered after executing a shell command with [c]:![c]#{cmd}
+*VimperatorEnter* Triggered after Firefox starts
+*VimperatorLeavePre* Triggered before exiting Firefox, just before destroying each module
+*VimperatorLeave* Triggered before exiting Firefox
+--------------------------------------------------------------
+
+{pat} is a regular expression, use .* if you want to match all URLs.
+
+Note: This differs from Vim which uses a glob rather than a regexp for {pat}.
+
+The following keywords are available where relevant:
+
+`--------------`----------------------------------------------
+*<url>* The URL against which the event was selected.
+*<title>* The page, bookmark or download title.
+*<tab>* The tab in which the event occurred.
+*<tags>* The tags applied to <url>. Only for *BookmarkAdd*.
+*<keyword>* The keywords applied to the bookmark. Only for *BookmarkAdd*.
+*<icon>* The icon associated with <url>. Only for *BookmarkAdd*.
+*<size>* The size of a downloaded file. Only for *DownloadPost*.
+*<file>* The target destination of a download. Only for *DownloadPost*.
+*<state>* The new fullscreen state. Only for *Fullscreen*.
+*<name>* The color scheme name. Only for *ColorScheme*.
+--------------------------------------------------------------
+
+________________________________________________________________________________
+
+
+|:doautoa| |:doautoall|
+||:doautoa[ll] {event} [a][url][a]|| +
+________________________________________________________________________________
+Apply the autocommands matching the specified URL to all buffers. If no
+[a][url][a] is specified use the current URL.
+________________________________________________________________________________
+
+
+|:do| |:doautocmd|
+||:do[autocmd] {event} [a][url][a]|| +
+________________________________________________________________________________
+Apply the autocommands matching the specified URL to the current buffer. If no
+[a][url][a] is specified use the current URL.
+________________________________________________________________________________
+
+section:Examples[autocmd-examples]
+
+Enable _passthrough_ mode on all Google sites:
+
+\{nbsp}[c]:autocmd LocationChange .* js modes.passAllKeys = /google\.com/.test(buffer.URL)[c]
+
+Enable _passthrough_ mode on *some* Google sites:
+
+\{nbsp}[c]:autocmd LocationChange .* js modes.passAllKeys = /(www|mail)\.google\.com/.test(buffer.URL)[c]
+
+Set the filetype to mail when editing email at Gmail:
+
+\{nbsp}[c]:autocmd LocationChange .* :set editor=gvim\ -f[c] +
+\{nbsp}[c]:autocmd LocationChange mail\.google\.com :set editor="gvim -f -c 'set ft=mail'"[c]
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/browsing.txt b/xulmus/locale/en-US/browsing.txt
new file mode 100755
index 00000000..9b44fa8a
--- /dev/null
+++ b/xulmus/locale/en-US/browsing.txt
@@ -0,0 +1,349 @@
+HEADER
+
+|surfing| |browsing| +
+
+Vimperator overrides nearly all Firefox keys in order to make browsing more
+pleasant for Vim users. On the rare occasions when you want to pass a keystroke
+to Firefox, or to the web page, and have it retain its original meaning you
+have 2 possibilities:
+
+|pass-through| |<C-z>| |CTRL-Z| +
+||CTRL-Z||
+________________________________________________________________________________
+Disable all Vimperator keys except [m]<Esc>[m] and pass them to the next event
+handler. This is especially useful, if JavaScript controlled forms like the
+RichEdit form fields of Gmail don't work anymore. To exit this mode, press
+[m]<Esc>[m]. If you also need to pass [m]<Esc>[m] in this mode to the web page,
+prepend it with [m]<C-v>[m].
+________________________________________________________________________________
+
+|send-key| |<C-v>| |CTRL-V| +
+||CTRL-V||
+________________________________________________________________________________
+If you only need to pass a single key to a JavaScript form field or another
+extension prefix the key with [m]<C-v>[m]. Also works to unshadow Firefox
+shortcuts like [m]<C-o>[m] which are otherwise hidden in Vimperator. When
+Vimperator mode is temporarily disabled with [m]<C-z>[m], [m]<C-v>[m] will pass
+the next key to Vimperator instead of the web page.
+________________________________________________________________________________
+
+section:Opening{nbsp}web{nbsp}pages[opening]
+
+|o| |:o| |:open|
+||:o[pen][!] [a][arg1][a], [a][arg2][a], ...|| +
+||o||
+________________________________________________________________________________
+Open one or more URLs in the current tab.
+Multiple URLs can be separated with 'urlseparator' (default: ", " Note that the
+space after the comma is required.)
+The first URL is opened in the current tab, and all other URLs are
+opened in new tabs.
+Each token is analyzed and in this order:
+
+1. Opened as a local file if it is an existing relative or absolute filename.
+ - [c]:open /etc/fstab[c] shows the file system table.
+ - [c]:open ../other/foo.html[c] in your home directory opens
+ [a]/home/other/foo.html[a]
+2. Opened with the specified search engine if the token looks like a search
+ string and the first word is the name of a search engine ([c]:open wikipedia
+ linus torvalds[c] opens the Wikipedia entry for linus torvalds). The short
+ name of a search engine is automatically guessed from its name. If you want
+ to set a custom name, you can change it with [c]:dialog searchengines[c].
+3. Opened with the default search engine or keyword (specified with the
+ 'defsearch' option) if the first word is no search engine ([c]:open linus
+ torvalds[c] opens a Google search for linux torvalds).
+4. Passed directly to Firefox in all other cases ([c]:open www.osnews.com,
+ www.slashdot.org[c] opens OSNews in the current, and Slashdot in a new
+ background tab).
+
+You can use [c]:open -tags linux torvalds<Tab>[c] to complete bookmarks with
+tag "linux" and which contain "torvalds". Note that -tags support is only
+available for tab completion, not for the actual command.
+The items which are completed on [m]<Tab>[m] are specified in the 'complete'
+option.
+Without argument, reloads the current page.
+Without argument but with [!], reloads the current page skipping the cache.
+________________________________________________________________________________
+
+
+|t| |:t| |:tabopen| |:tabnew| |:tabe| |:tabedit|
+||:tabopen[!] [a][arg1][a], [a][arg2][a], ...|| +
+||t||
+________________________________________________________________________________
+Just like [c]:open[c] but also uses a new tab for the first URL. When
+used with [!], the *tabopen* value of the 'activate' option is negated.
+________________________________________________________________________________
+
+
+|T| +
+||T||
+________________________________________________________________________________
+Open one or more URLs in a new tab based on current location. Works like
+[m]t[m] but preselects current URL in the [c]:tabopen[c] query.
+________________________________________________________________________________
+
+
+|:tabd| |:tabduplicate|
+||:[count]tabd[uplicate][!]|| +
+________________________________________________________________________________
+Duplicates current tab [count] times. Uses *tabopen* value of the 'activate'
+option to determine if the last cloned tab should be activated. When used with
+[!], *tabopen* value is negated.
+________________________________________________________________________________
+
+
+|O| +
+||O||
+________________________________________________________________________________
+Open one or more URLs in the current tab based on current location. Works
+like [m]o[m] but preselects current URL in the [c]:open[c] query.
+________________________________________________________________________________
+
+
+|:winopen| |:wopen| |:winedit|
+||:wino[pen][!] [a][arg1][a], [a][arg2][a], ...|| +
+________________________________________________________________________________
+Just like [c]:tabopen[c] but opens the resulting web page(s) in a new window.
+________________________________________________________________________________
+
+
+|<MiddleMouse>| |p| +
+||p||
+________________________________________________________________________________
+Open (put) a URL based on the current clipboard contents in the current buffer.
+You can also just select (for non-X11 users: copy) some non-URL text, and
+search for it with the default search engine or keyword (specified by the
+'defsearch' option) with [m]p[m].
+________________________________________________________________________________
+
+
+|P| +
+||P||
+________________________________________________________________________________
+Open (put) a URL based on the current clipboard contents in a new buffer. Works
+like [m]p[m] but opens a new tab. +
+Whether the new buffer is activated, depends on the 'activate' option.
+________________________________________________________________________________
+
+
+|gP| +
+||gP||
+________________________________________________________________________________
+Open (put) a URL based on the current clipboard contents in a new buffer.
+Works like [m]P[m] but inverts the 'activate' option.
+________________________________________________________________________________
+
+
+|<C-x>|
+||[count]<C-x>||
+________________________________________________________________________________
+Decrements the last number in URL by 1, or by [count] if given. Negative
+numbers are not supported, as this is not generally useful, so the number cannot
+be decremented past 0.
+________________________________________________________________________________
+
+
+|<C-a>|
+||[count]<C-a>||
+________________________________________________________________________________
+Increments the last number in URL by 1, or by [count] if given.
+________________________________________________________________________________
+
+
+|\~| +
+||\~||
+________________________________________________________________________________
+Open home directory. You can also use the hints and have the probably fastest
+file browser on earth. :)
+________________________________________________________________________________
+
+section:Navigating[navigating]
+
+|H| |<C-o>| |CTRL-O| |:ba| |:back|
+||:[count]ba[ck] [url]|| +
+||:ba[ck]!|| +
+||CTRL-o||
+________________________________________________________________________________
+Go [count] pages back in the browser history. If [url] is specified go back to
+the first matching URL. The special version [c]:back![c] goes to the beginning
+of the browser history.
+________________________________________________________________________________
+
+
+|L| |<C-i>| |CTRL-i| |:fo| |:fw| |:forward|
+||:[count]fo[rward] [url]|| +
+||:fo[rward]!|| +
+||CTRL-i||
+________________________________________________________________________________
+Go [count] pages forward in the browser history. If [url] is specified go
+forward to the first matching URL. The special version [c]:forward![c] goes to
+the end of the browser history.
+________________________________________________________________________________
+
+
+|:ju| |:jumps|
+||:ju[mps]||
+________________________________________________________________________________
+List all jumps aka current tab's history aka session history.
+
+Current history position is marked with >, jump numbers are counters to be used
+with [c]:back[c] (above zero record) or [c]:forward[c] (below zero record).
+________________________________________________________________________________
+
+
+|gh|
+||gh||
+________________________________________________________________________________
+Go home. Opens the homepage in the current tab.
+________________________________________________________________________________
+
+
+|gH| +
+||gH||
+________________________________________________________________________________
+Go home in a new tab. Opens the homepage in a new tab. Whether the new tab is
+activated or not depends on the 'activate' option.
+________________________________________________________________________________
+
+
+|gu|
+||[count]gu||
+________________________________________________________________________________
+Go to [count]th parent directory. +
+
+[m]2gu[m] on _http://www.example.com/dir1/dir2/file.htm_ opens
+_http://www.example.com/dir1/_.
+________________________________________________________________________________
+
+
+|gU|
+||gU||
+________________________________________________________________________________
+Go to the root of the web site. +
+
+[m]gU[m] on _http://www.example.com/dir1/dir2/file.htm_ opens
+_http://www.example.com/_.
+When browsing a local directory, it goes to the root directory.
+________________________________________________________________________________
+
+section:Reloading[reloading]
+
+|r|
+||r||
+________________________________________________________________________________
+Force reloading of the current page.
+________________________________________________________________________________
+
+
+|R|
+||R||
+________________________________________________________________________________
+Force reloading of the current page skipping the cache.
+________________________________________________________________________________
+
+
+|:re| |:reload| +
+||:re[load][!]||
+________________________________________________________________________________
+Reload current page. Forces reloading of the current page. If [!] is
+given, skip the cache.
+________________________________________________________________________________
+
+
+|:reloada| |:reloadall| +
+||:reloada[ll][!]||
+________________________________________________________________________________
+Reload all pages. Forces reloading of all pages. If [!] is given, skip the cache.
+________________________________________________________________________________
+
+section:Stopping[stopping]
+
+|<C-c>|
+||<C-c>||
+________________________________________________________________________________
+Stop loading the current web page.
+________________________________________________________________________________
+
+
+|:st| |:stop|
+||:st[op]||
+________________________________________________________________________________
+Stop loading. Stop loading current web page.
+________________________________________________________________________________
+
+section:Writing[writing,save-file]
+
+|:w| |:write| |:sav| |:saveas| +
+||:sav[eas][!] [a][file][a]||
+________________________________________________________________________________
+Save current web page to disk. If [a][file][a] is omitted, save to the page's
+default filename. Existing documents will only be overwritten if [!] is given.
+________________________________________________________________________________
+
+section:Quitting[quitting,save-session]
+
+|:q| |:quit| +
+||:q[uit]||
+________________________________________________________________________________
+Quit current tab. If this is the last tab in the window, close the window. If
+this was the last window, close Vimperator. When quitting Vimperator, the
+session is not stored.
+________________________________________________________________________________
+
+
+|:qa| |:qall| |:quita| |:quitall| +
+||:quita[ll]||
+________________________________________________________________________________
+Quit Vimperator. Quit Vimperator, no matter how many tabs/windows are open.
+The session is not stored.
+________________________________________________________________________________
+
+
+|:wc| |:wclose| |:winc| |:winclose|
+||:winc[lose]|| +
+________________________________________________________________________________
+Close window.
+________________________________________________________________________________
+
+
+|:xa| |:xall| |:wq| |:wqa| |:wqall|
+||:wqa[ll]|| +
+||:xa[ll]||
+________________________________________________________________________________
+Save the session and quit. Quit Vimperator, no matter how many tabs/windows
+are open. The session is stored. [c]:wq[c] is different from Vim, as it
+closes the window instead of just one tab by popular demand. Complain on the
+mailing list, if you want to change that.
+________________________________________________________________________________
+
+
+|ZQ|
+||ZQ||
+________________________________________________________________________________
+Quit and don't save the session. Works like [c]:qall[c].
+________________________________________________________________________________
+
+
+|ZZ|
+||ZZ||
+________________________________________________________________________________
+Quit and save the session. Quit Vimperator, no matter how many tabs/windows
+are open. The session is stored. Works like [c]:xall[c].
+________________________________________________________________________________
+
+section:The{nbsp}current{nbsp}directory[current-directory]
+
+|:chd| |:chdir| |:cd|
+||:cd [-|path]||
+________________________________________________________________________________
+Change the current directory. [c]:cd -[c] changes to the last directory.
+________________________________________________________________________________
+
+
+|:pw| |:pwd|
+||:pw[d]||
+________________________________________________________________________________
+Print the current directory name.
+________________________________________________________________________________
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/buffer.txt b/xulmus/locale/en-US/buffer.txt
new file mode 100755
index 00000000..91022f27
--- /dev/null
+++ b/xulmus/locale/en-US/buffer.txt
@@ -0,0 +1,361 @@
+HEADER
+
+|buffer| |document| +
+
+Vimperator holds exactly one buffer object for each tab. It is usually an
+(X)HTML document with advanced features.
+
+section:Buffer{nbsp}information[buffer-information]
+
+|<C-g>| +
+||<C-g>||
+________________________________________________________________________________
+Print the current file name. Also shows some additional file information like
+file size or the last modified date.
+________________________________________________________________________________
+
+
+|g<C-g>| +
+||g<C-g>||
+________________________________________________________________________________
+Print file information. Same as [c]:pa[geinfo][c].
+________________________________________________________________________________
+
+
+|:pa| |:pageinfo| +
+||:pa[geinfo]||
+________________________________________________________________________________
+Show various page information. See [c]:help 'pageinfo'[c] for available options.
+________________________________________________________________________________
+
+
+|gf| +
+||gf||
+________________________________________________________________________________
+View source. Opens the source code of the current web site with the internal
+editor in the current tab.
+________________________________________________________________________________
+
+
+|gF| +
+||gF||
+________________________________________________________________________________
+View source with an external editor. Opens the source code of the current web
+site with the external editor specified by the 'editor' option. For now the
+external editor must be able to download and open files from a remote URL.
+________________________________________________________________________________
+
+
+|:vie| |:viewsource|
+||:vie[wsource][!] [a][url][a]|| +
+________________________________________________________________________________
+View source code of current document. If [a][url][a] is specified then view the
+source of that document. When [!] is given, it is opened with the external
+editor.
+________________________________________________________________________________
+
+section:Motion{nbsp}commands[motion,scrolling]
+
+|^| |0| +
+||0||
+________________________________________________________________________________
+Scroll to the absolute left of the document. Unlike in Vim, [m]0[m] and [m]^[m]
+work exactly the same way.
+________________________________________________________________________________
+
+
+|$| +
+||$||
+________________________________________________________________________________
+Scroll to the absolute right of the document
+________________________________________________________________________________
+
+
+|<Home>| |gg| +
+||[count]gg||
+________________________________________________________________________________
+Go to the top of the document. When used with [count] like in [m]35gg[m], it
+scrolls to 35% of the document.
+________________________________________________________________________________
+
+
+|<End>| |G| +
+||[count]G||
+________________________________________________________________________________
+Go to the end of the document. When used with [count] like in [m]35G[m], it
+scrolls to 35% of the document.
+________________________________________________________________________________
+
+
+|N%| +
+||{count}%||
+________________________________________________________________________________
+Scroll to {count} percent of the document.
+________________________________________________________________________________
+
+
+|<Left>| |h| +
+||[count]h||
+________________________________________________________________________________
+Scroll document to the left. If [count] is specified then move [count] times as
+much to the left. +
+If the document cannot scroll more, a beep is emitted (unless 'visualbell' is
+set).
+________________________________________________________________________________
+
+
+|<C-e>| |<Down>| |j| +
+||[count]j||
+________________________________________________________________________________
+Scroll document down. If [count] is specified then move [count] times as much
+down. +
+If the document cannot scroll more, a beep is emitted (unless 'visualbell' is
+set).
+________________________________________________________________________________
+
+
+|<C-y>| |<Up>| |k| +
+||[count]k||
+________________________________________________________________________________
+Scroll document up. If [count] is specified then move [count] times as much up. +
+If the document cannot scroll more, a beep is emitted (unless 'visualbell' is
+set).
+________________________________________________________________________________
+
+
+|<C-d>| +
+||[count]<C-d>||
+________________________________________________________________________________
+Scroll window downwards in the buffer. The number of lines is set by the
+'scroll' option which defaults to half a page. If [count] is given 'scroll' is
+first set to this value.
+________________________________________________________________________________
+
+
+|<C-u>| +
+||[count]<C-u>||
+________________________________________________________________________________
+Scroll window upwards in the buffer. The number of lines is set by the
+'scroll' option which defaults to half a page. If [count] is given 'scroll' is
+first set to this value.
+________________________________________________________________________________
+
+
+|<Right>| |l| +
+||[count]l||
+________________________________________________________________________________
+Scroll document to the right. If [count] is specified then move [count] times
+as much to the right. +
+If the document cannot scroll more, a beep is emitted (unless 'visualbell' is
+set).
+________________________________________________________________________________
+
+
+|<S-Space>| |<PageUp>| |<C-b>| +
+||[count]<C-b>||
+________________________________________________________________________________
+Scroll up a full page. Scroll window [count] pages Backwards (upwards) in the buffer.
+________________________________________________________________________________
+
+
+|<Space>| |<PageDown>| |<C-f>| +
+||[count]<C-f>||
+________________________________________________________________________________
+Scroll down a full page. Scroll window [count] pages Forwards (downwards) in the buffer.
+________________________________________________________________________________
+
+section:Jumping{nbsp}to{nbsp}elements[jumping]
+
+|<Tab>| +
+||<Tab>||
+________________________________________________________________________________
+Advance keyboard focus to the next element.
+________________________________________________________________________________
+
+
+|<S-Tab>| +
+||<S-Tab>||
+________________________________________________________________________________
+Rewind keyboard focus to the previous element.
+________________________________________________________________________________
+
+
+|gi| +
+||[count]gi||
+________________________________________________________________________________
+Focus last used input field. If there is no last input field, it focuses the
+first input field. When used with [count] it directly jumps to the [count]th input
+field.
+________________________________________________________________________________
+
+
+|]f| +
+||[count]]f||
+________________________________________________________________________________
+Focus next frame. Transfer keyboard focus to the [count]th next frame in
+order. The newly focused frame is briefly colored red. Does not wrap.
+________________________________________________________________________________
+
+
+|[f| +
+||[count][f||
+________________________________________________________________________________
+Focus previous frame. Transfer keyboard focus to the [count]th previous frame
+in order. The newly focused frame is briefly colored red. Does not wrap.
+________________________________________________________________________________
+
+
+|]]| +
+||[count]]]||
+________________________________________________________________________________
+Follow the link labeled \'next' or \'>' if it exists. Useful when browsing
+forums or documentation. Change 'nextpattern' to modify its behavior. It
+follows relations between files too.
+________________________________________________________________________________
+
+
+|[[| +
+||[count][[||
+________________________________________________________________________________
+Follow the link labeled \'prev', \'previous' or \'<' if it exists. Useful when
+browsing forums or documentation. Change 'previouspattern' to modify its
+behavior. It follows relations between files too.
+________________________________________________________________________________
+
+section:Zooming[zooming,zoom]
+
+The zooming commands are dependent on two properties -- a zoom range and a
+series of levels within that range.
+
+The absolute value of the page zoom is limited to a value within the configured
+zoom range (default: 30%--300%). The zoom levels are used by
+[m]zi[m]/[m]zo[m], and similar commands, to change the zoom value in steps. The
+default zoom levels are 30%, 50%, 67%, 80%, 90%, 100%, 110%, 120%, 133%, 150%,
+170%, 200%, 240%, 300%.
+
+The available zoom range can be changed by setting the \'zoom.minPercent' and
+\'zoom.maxPercent' Firefox preferences. The zoom levels can be changed using
+the \'toolkit.ZoomManager.zoomLevels' preference.
+
+Note: \'toolkit.ZoomManager.zoomLevels' is specified as a list of values
+between 0 and 1, not as a percentage.
+
+|+| |zi| +
+||[count]zi||
+________________________________________________________________________________
+Enlarge text zoom of current web page. Mnemonic: zoom in.
+________________________________________________________________________________
+
+
+|zm| +
+||[count]zm||
+________________________________________________________________________________
+Enlarge text zoom of current web page by a larger amount. Mnemonic: zoom more.
+________________________________________________________________________________
+
+
+|-| |zo| +
+||[count]zo||
+________________________________________________________________________________
+Reduce text zoom of current web page. Mnemonic: zoom out.
+________________________________________________________________________________
+
+
+|zr| +
+||[count]zr||
+________________________________________________________________________________
+Reduce text zoom of current web page by a larger amount. Mnemonic: zoom reduce.
+________________________________________________________________________________
+
+
+|zz| +
+||[count]zz||
+________________________________________________________________________________
+Set text zoom value of current web page. Zoom value can be between 30 and 300%.
+If it is omitted, text zoom is reset to 100%.
+________________________________________________________________________________
+
+
+|zI| +
+||[count]zI||
+________________________________________________________________________________
+Enlarge full zoom of current web page. Mnemonic: zoom in.
+________________________________________________________________________________
+
+
+|zM| +
+||[count]zM||
+________________________________________________________________________________
+Enlarge full zoom of current web page by a larger amount. Mnemonic: zoom more.
+________________________________________________________________________________
+
+
+|zO| +
+||[count]zO||
+________________________________________________________________________________
+Reduce full zoom of current web page. Mnemonic: zoom out.
+________________________________________________________________________________
+
+
+|zR| +
+||[count]zR||
+________________________________________________________________________________
+Reduce full zoom of current web page by a larger amount. Mnemonic: zoom reduce.
+________________________________________________________________________________
+
+
+|zZ| +
+||[count]zZ||
+________________________________________________________________________________
+Set full zoom value of current web page. Zoom value can be between 30 and
+300%. If it is omitted, full zoom is reset to 100%.
+________________________________________________________________________________
+
+
+|:zo| |:zoom|
+||:zo[om][!] [a][value][a]|| +
+||:zo[om][!] +{value} | -{value}|| +
+________________________________________________________________________________
+Set zoom value of current web page. [a][value][a] can be an absolute value
+between 30 and 300% or a relative value if prefixed with "-" or "+". If
+[a][value][a] is omitted, zoom is reset to 100%.
+
+Normally this command operates on the text zoom, if used with [!] it operates
+on full zoom.
+________________________________________________________________________________
+
+section:Copying{nbsp}text[copying,yanking]
+
+When running in X11, the text of the following commands is not only
+copied to the clipboard but is also put into the X11 selection, which
+can be pasted with the middle mouse button:
+
+|y| +
+||y||
+________________________________________________________________________________
+Yank current location to the clipboard. When running in X11 the location is
+also put into the selection, which can be pasted with the middle mouse button.
+________________________________________________________________________________
+
+
+|Y| +
+||Y||
+________________________________________________________________________________
+Copy currently selected text to the system clipboard.
+________________________________________________________________________________
+
+section:Alternate{nbsp}style{nbsp}sheets[alternate-stylesheet]
+
+Page authors may specify alternate style sheets for an HTML document. Users can
+then switch between these various style sheets, selecting their favorite.
+
+|:pagest| |:pagestyle|
+||:pagest[yle] [a][stylesheet][a]|| +
+________________________________________________________________________________
+Select the author style sheet to apply. If [a][stylesheet][a] is not specified
+the page's default style sheet is used.
+
+All author styling can be removed by setting the 'usermode' option.
+________________________________________________________________________________
+
+// vim: set filetype=asciidoc fdm=marker:
diff --git a/xulmus/locale/en-US/cmdline.txt b/xulmus/locale/en-US/cmdline.txt
new file mode 100755
index 00000000..9eabc590
--- /dev/null
+++ b/xulmus/locale/en-US/cmdline.txt
@@ -0,0 +1,80 @@
+HEADER
+
+|Command-line-mode| |Command-line| |mode-cmdline| +
+
+Command-line mode is used to enter Ex commands (":") and text search patterns
+("/" and "?").
+
+|:| +
+||:||
+________________________________________________________________________________
+Start Command-line mode. In Command-line mode, you can perform extended
+commands, which may require arguments.
+________________________________________________________________________________
+
+
+section:Command-line{nbsp}editing[cmdline-editing]
+
+|c_<C-c>| +
+||<C-c>||
+________________________________________________________________________________
+Quit Command-line mode without executing.
+________________________________________________________________________________
+
+
+|c_<C-]>| +
+||<C-]>||
+________________________________________________________________________________
+Expand a Command-line abbreviation.
+________________________________________________________________________________
+
+
+|c_<Up>| +
+||<Up>||
+________________________________________________________________________________
+Recall the previous command line from the history list which matches the
+current command line.
+________________________________________________________________________________
+
+
+|c_<Down>| +
+||<Down>||
+________________________________________________________________________________
+Recall the next command line from the history list which matches the current
+command line.
+________________________________________________________________________________
+
+
+|c_<S-Up>| |c_<PageUp>|
+||<S-Up>|| +
+||<PageUp>||
+________________________________________________________________________________
+Recall the previous command line from the history list.
+________________________________________________________________________________
+
+
+|c_<S-Down>| |c_<PageDown>|
+||<S-Down>|| +
+||<PageDown>||
+________________________________________________________________________________
+Recall the next command line from the history list.
+________________________________________________________________________________
+
+section:Command-line{nbsp}completion[cmdline-completion]
+
+|c_<Tab>| +
+||<Tab>||
+________________________________________________________________________________
+Complete the word in front of the cursor according to the behavior specified in
+'wildmode'. If 'wildmode' contains "list" and there are multiple matches then
+the completion menu window is opened.
+________________________________________________________________________________
+
+
+|c_<S-Tab>| +
+||<S-Tab>||
+________________________________________________________________________________
+Complete the previous full match when 'wildmode' contains "full".
+________________________________________________________________________________
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/developer.txt b/xulmus/locale/en-US/developer.txt
new file mode 100755
index 00000000..cf875d82
--- /dev/null
+++ b/xulmus/locale/en-US/developer.txt
@@ -0,0 +1,88 @@
+HEADER
+
+section:Writing{nbsp}documentation[writing-docs,documentation]
+
+For every new feature, writing documentation is _mandatory_ for the patch to
+be accepted. The docs are written in
+http://www.methods.co.nz/asciidoc/index.html[asciidoc] version 8.2.x.
+They are placed in the _src/locale/en-US/_ directory and compiled with
+_make doc_. Please refer to the
+http://www.methods.co.nz/asciidoc/userguide.html[asciidoc documentation] above
+for details. Usually you can just write text as is, and mostly it will be
+interpreted correctly. The only difficult part is to write special sections
+like for help::help[various.html#online-help].
+
+----------------------------------------------------------------------------------
+|<F1>| |:help| |:h| |help|
+||:h[elp] {subject}|| +
+||<F1>||
+____________________________________________________________________________
+Open help window.
+The default section is shown unless {subject} is specified.
+If you need help for a specific topic, try [c]:help overview[c].
+____________________________________________________________________________
+----------------------------------------------------------------------------------
+
+is displayed as:
+
+++++++++++++++++++++++++++++++++++++++++
+<p><span class="hiddentag">&lt;F1&gt;</span> <span
+class="hiddentag">:help</span> <span class="hiddentag">:h</span> <span
+class="hiddentag">help</span>
+
+<div class="key">:h[elp] <span class="argument">&#123;subject&#125;</span></div><br />
+<div class="key">&lt;F1&gt;</div></p>
+<div class="quoteblock">
+<div class="quoteblock-content">
+<p>Open help window.
+The default section is shown unless <span class="argument">&#123;subject&#125;</span> is specified.
+If you need help for a specific topic, try <span class="command">:help overview</span>.</p>
+</div></div>
++++++++++++++++++++++++++++++++++++++++
+
+Some notes about the code above:
+
+- *$$|<F1>|$$* defines a _tag_. A tag is written at the right in magenta and let's
+ you jump to a topic with [c]:help <F1>[c]. Note that you must write it from
+ right to left, so in the above example $$|help|$$ will be the most left tag,
+ and $$|<F1>|$$ the most right one.
+- *$$||:h[elp] {subject}|| +$$* and *$$||<F1>||$$* define command or mapping
+ names and are printed on the left side. Note the + at the end of one
+ command, that indicates a new line. There is no general rule when a new line
+ is needed and when not, just try it out and see what looks better.
+- The actual help code for this command is embedded in at least 4 underscores
+ (_). This generates a quoteblock and indents the text so it is more clear
+ that it belongs to the command.
+- Wrap things in *$$[c]$$* and they are drawn like a :command. Also *$$[o]$$*,
+ *$$[m]$$* and *$$[a]$$* are available to markup options, mappings, and
+ arguments.
+- As a convenience, any string within \{...\} and $$[count]$$ and $$[!]$$ are
+ automatically marked up as an argument.
+
+There are also some additional asciidoc commands specifically for writing
+Vimperator documentation:
+
+- *$$section:Writing{nbsp}documentation[writing-docs,documentation]$$* Creates
+ a new section like _Writing Documentation_ in this help file with 2 tags.
+- *$$help:developer{nbsp}information[developer.html#documentation]$$* creates
+ a link with text _developer information_ to the tag _documentation_ in
+ the file _developer.html_.
+
+
+If you don't know in which file/section you should put some documentation, ask
+on the mailing list or on #vimperator. Usually help should be grouped together
+in logically connected subject areas like
+help:opening{nbsp}web{nbsp}pages[browsing.html#opening].
+
+section:Generating{nbsp}documentation[generating-docs]
+
+You can also autogenerate most of the asciidoc help after you have written a
+new command, mapping or option. For this, use:
+
+ :echo util.generateHelp(commands.get("addons"), "Extra text")
+
+Now you can copy the asciidoc text but always make sure it looks OK after
+you compile the help file with "make doc", as the auto-generation might
+not work correctly for all special cases.
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/eval.txt b/xulmus/locale/en-US/eval.txt
new file mode 100755
index 00000000..17c71dda
--- /dev/null
+++ b/xulmus/locale/en-US/eval.txt
@@ -0,0 +1,84 @@
+HEADER
+
+|expression| |expr| |eval| +
+
+INTRO TO BE WRITTEN...
+
+|:ec| |:echo| +
+||:ec[ho] {expr}||
+________________________________________________________________________________
+Echo the expression. Useful for showing informational messages. Multiple lines
+can be separated by \n. {expr} can either be a quoted string, or any expression
+which can be fed to eval() like 4+5. You can also view the source code of
+objects and functions if the return value of {expr} is an object or function.
+________________________________________________________________________________
+
+
+|:echoe| |:echoerr|
+||:echoe[rr] {expr}|| +
+________________________________________________________________________________
+Echo the expression as an error message. Just like [c]:ec[ho][c] but echoes
+the result highlighted as ErrorMsg and saves it to the message history.
+________________________________________________________________________________
+
+
+|:echom| |:echomsg|
+||:echom[sg] {expr}|| +
+________________________________________________________________________________
+Echo the expression as an informational message. Just like [c]:ec[ho][c] but
+also saves the message in the message history.
+________________________________________________________________________________
+
+
+|:exe| |:execute|
+||:exe[cute] {expr}|| +
+________________________________________________________________________________
+Execute the string that results from the evaluation of {expr} as an Ex command.
+Example: [c]:execute "source " + io.getRCFile().path[c] sources the appropriate
+RC file.
+
+Note: Unlike Vim this currently only supports a single argument.
+________________________________________________________________________________
+
+
+|:js| |:javas| |:javascript|
+||:javas[cript] {cmd}|| +
+||:javascript <<{endpattern}\n{empty}{script}\n{empty}{endpattern} || +
+||:javascript[!]||
+________________________________________________________________________________
+Run any JavaScript command through eval(). Acts as a JavaScript interpreter by
+passing the argument to `eval()`.
+[c]:javascript alert("Hello world")[c] shows a dialog box with the text "Hello world".
+[c]:javascript <<EOF[c] reads all the lines until a line starting with "EOF"
+is found, and interpret them with the JavaScript _eval()_ function.
+
+The special version [c]:javascript![c] opens the JavaScript console of
+Firefox.
+
+[m]<Tab>[m] completion is available for [c]:javascript {cmd}<Tab>[c] (but not
+yet for the [c]:js <<EOF[c] multiline widget). Be aware that Vimperator needs
+to run {cmd} through eval() to get the completions, which could have unwanted
+side effects.
+________________________________________________________________________________
+
+// >> To make the syntax highlighting happy
+
+|:let|
+||:let {var-name} [+-.]= {expr1}|| +
+||:let {var-name}|| +
+||:let||
+________________________________________________________________________________
+Sets or lists a variable. Sets the variable {var-name} to the value of the
+expression {expr1}. If no expression is given, the value of the variable is
+displayed.Without arguments, displays a list of all variables.
+________________________________________________________________________________
+
+
+|:unl| |:unlet|
+||:unl[et][!] {name} ...|| +
+________________________________________________________________________________
+Deletes the variable {name}. Several variable names can be given. When used
+with [!] no error message is output for non-existing variables.
+________________________________________________________________________________
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/gui.txt b/xulmus/locale/en-US/gui.txt
new file mode 100755
index 00000000..4da826c5
--- /dev/null
+++ b/xulmus/locale/en-US/gui.txt
@@ -0,0 +1,90 @@
+HEADER
+
+|gui| +
+
+Although Vimperator offers the most frequently used Firefox functionality via
+Ex and Normal mode commands there may be times when directly accessing the GUI
+is required. There are commands for accessing the menu system, standard dialogs
+and the sidebar.
+
+|:emenu| +
+||:emenu {menu}||
+________________________________________________________________________________
+Execute {menu} from the command line. This command provides command-line access
+to all menu items available from the main Firefox menubar. {menu} is a
+hierarchical path to the menu item with each submenu separated by a period.
+E.g. [c]:emenu File.Open File...[c]
+________________________________________________________________________________
+
+
+|:addo| |:addons| +
+||:addo[ns]||
+________________________________________________________________________________
+Show available Browser Extensions and Themes.
+You can add/remove/disable browser extensions from this dialog.
+Be aware that not all Firefox extensions work, because Vimperator overrides
+some key bindings and changes Firefox's GUI.
+________________________________________________________________________________
+
+
+|:dia| |:dialog|
+||:dia[log] [a][firefox-dialog][a]|| +
+________________________________________________________________________________
+Open a Firefox dialog.
+
+Available dialogs:
+`------------------`-----------------------------------
+*about* About Firefox
+*addbookmark* Add bookmark for the current page
+*addons* Manage Add-ons
+*bookmarks* List your bookmarks
+*checkupdates* Check for updates
+*cleardata* Clear private data
+*cookies* List your cookies
+*console* JavaScript console
+*customizetoolbar* Customize the Toolbar
+*dominspector* DOM Inspector
+*downloads* Manage Downloads
+*history* List your history
+*import* Import Preferences, Bookmarks, History, etc. from other browsers
+*openfile* Open the file selector dialog
+*pageinfo* Show information about the current page
+*pagesource* View page source
+*places* Places Organizer: Manage your bookmarks and history
+*preferences* Show Firefox preferences dialog
+*printpreview* Preview the page before printing
+*printsetup* Setup the page size and orientation before printing
+*print* Show print dialog
+*saveframe* Save frame to disk
+*savepage* Save page to disk
+*searchengines* Manage installed search engines
+*selectionsource* View selection source
+-------------------------------------------------------
+
+________________________________________________________________________________
+
+
+|:dl| |:downl| |:downloads| +
+||:downl[oads]||
+________________________________________________________________________________
+Show progress of current downloads. Open the original Firefox download dialog
+in a new tab. Here, downloads can be paused, canceled and resumed.
+________________________________________________________________________________
+
+
+|:sbcl| |:sbclose| +
+||:sbcl[ose]||
+________________________________________________________________________________
+Close the sidebar window.
+________________________________________________________________________________
+
+
+|:sbope| |:sbopen| |:sb| |:sbar| |:sideb| |:sidebar| +
+||:sidebar {name}||
+________________________________________________________________________________
+Open the sidebar window. {name} is any of the menu items listed under the
+standard Firefox View->Sidebar menu. Add-ons, Preferences and Downloads are
+also available in the sidebar.
+________________________________________________________________________________
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/help.js b/xulmus/locale/en-US/help.js
new file mode 100755
index 00000000..ece4273f
--- /dev/null
+++ b/xulmus/locale/en-US/help.js
@@ -0,0 +1,24 @@
+
+function checkFragment()
+{
+ let frag = document.location.hash.substr(1);
+ if (!frag || document.getElementById(frag))
+ return;
+ let elem = document.evaluate('//*[@class="tag" and text()="' + frag + '"]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);
+ if (elem)
+ window.content.scrollTo(0, elem.getBoundingClientRect().top - 10); // 10px context
+}
+
+document.addEventListener("load", checkFragment, true);
+window.addEventListener("message", function (event) {
+ if (event.data == "fragmentChange")
+ checkFragment();
+}, true);
+
+document.addEventListener("click", function (event) {
+ let evt = document.createEvent("UIEvents");
+ evt.initEvent("liberatorHelpLink", true, true);
+ event.target.dispatchEvent(evt);
+}, true);
+
+// vim: set fdm=marker sw=4 ts=4 et:
diff --git a/xulmus/locale/en-US/hints.txt b/xulmus/locale/en-US/hints.txt
new file mode 100755
index 00000000..ef3200bb
--- /dev/null
+++ b/xulmus/locale/en-US/hints.txt
@@ -0,0 +1,67 @@
+HEADER
+
+|quick-hints| |hints| +
+
+INTRO TO BE WRITTEN...
+
+|f| +
+||#f#{hint}||
+________________________________________________________________________________
+Start QuickHint mode. In QuickHint mode, every hintable item (according to the
+'hinttags' XPath query) is assigned a unique number. You can now either type
+this number or type any part of the URL which you want to follow, and it is
+followed as soon as it can be uniquely identified. Often it can be useful to
+combine these techniques to narrow down results with some letters, and then
+typing a single digit to make the match unique. Pressing [m]<Leader>[m]
+(defaults to [c]:let mapleader = "\"[c]) toggles "escape-mode", where numbers
+are treated as normal text. +
+[m]<Esc>[m] stops this mode at any time.
+________________________________________________________________________________
+
+
+|F| +
+||#F#{hint}||
+________________________________________________________________________________
+Start QuickHint mode, but open link in a new tab. Like normal QuickHint
+mode (activated with [m]f[m]) but opens the link in a new tab. The new
+tab will be loaded in background according to the
+\'browser.tabs.loadInBackground' Firefox preference.
+________________________________________________________________________________
+
+
+|extended-hints| +
+
+|;| +
+||#;#{mode}{empty}{hint}||
+________________________________________________________________________________
+Start an extended hint mode. ExtendedHint mode is useful for performing
+operations on hinted elements other than the default left mouse click. For
+example, you can yank link locations, open them in a new window or save images.
+If you want to yank the location of hint [a]24[a], press [m];y[m] to start this
+hint mode. Then press [a]24[a] to copy the hint location.
+
+{mode} can be one of: +
+
+* |;;| [m];[m] to focus a link and hover it with the mouse
+* |;?| [m]?[m] to show information about the element (incomplete)
+* |;s| [m]s[m] to save its destination
+* |;a| [m]a[m] to save its destination (prompting for save location)
+* |;f| [m]f[m] to focus a frame
+* |;o| [m]o[m] to open its location in the current tab
+* |;t| [m]t[m] to open its location in a new tab
+* |;b| [m]b[m] to open its location in a new background tab
+* |;w| [m]w[m] to open its destination in a new window
+* |;F| [m]F[m] to follow a sequence of [m]<CR>[m]-delimited hints in background tabs
+* |;O| [m]O[m] to generate an [c]:open[c] with hint's URL (like [m]O[m])
+* |;T| [m]T[m] to generate a [c]:tabopen[c] with hint's URL (like [m]T[m])
+* |;W| [m]W[m] to generate a [c]:winopen[c] with hint's URL
+* |;v| [m]v[m] to view its destination source
+* |;V| [m]V[m] to view its destination source in the external editor
+* |;y| [m]y[m] to yank its destination location
+* |;Y| [m]Y[m] to yank its text description
+
+Hintable elements for all extended hint modes can be set in the
+'extendedhinttags' XPath string.
+________________________________________________________________________________
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/index.txt b/xulmus/locale/en-US/index.txt
new file mode 100755
index 00000000..5a6a2fbb
--- /dev/null
+++ b/xulmus/locale/en-US/index.txt
@@ -0,0 +1,316 @@
+HEADER
+
+|index| +
+
+This file contains a list of all available commands.
+
+section:Insert{nbsp}mode[insert-index]
+
+||[m]<C-i>[m]|| Launch the external editor +
+||[m]<C-]>[m]|| Expand an Insert-mode abbreviation +
+
+section:Normal{nbsp}mode[normal-index]
+
+||[m]<C-^>[m]|| Select the alternate tab or the [count]th tab +
+||[m]<C-a>[m]|| Increment last number in URL +
+||[m]<C-b>[m]|| Scroll up a full page +
+||[m]<C-c>[m]|| Stop loading +
+||[m]<C-d>[m]|| Scroll window downwards in the buffer +
+||[m]<C-f>[m]|| Scroll down a full page +
+||[m]<C-g>[m]|| Print the current file name +
+||[m]<C-i>[m]|| Go to a newer position in the jump list +
+||[m]<C-l>[m]|| Redraw the screen +
+||[m]<C-o>[m]|| Go to an older position in the jump list +
+||[m]<C-u>[m]|| Scroll window upwards in the buffer +
+||[m]<C-v>[m]|| Pass through next key +
+||[m]<C-x>[m]|| Decrement last number in URL +
+||[m]<C-z>[m]|| Temporarily ignore all Vimperator key bindings +
+
+||[m]<Esc>[m]|| Focus content +
+
+||[m]<F1>[m]|| Open help window +
+
+||[m]<S-Tab>[m]|| Rewind keyboard focus +
+||[m]<Tab>[m]|| Advance keyboard focus +
+
+||[m]0[m]|| Scroll to the absolute left of the document +
+||[m]$[m]|| Scroll to the absolute right of the document +
+
+||[m]A[m]|| Toggle bookmarked state of current URL +
+||[m]B[m]|| Show buffer list +
+||[m]D[m]|| Delete current buffer, focus tab to the left +
+||[m]F[m]|| Start QuickHint mode, but open link in a new tab +
+||[m]G[m]|| Go to the end of the document +
+||[m]H[m]|| Go back in the browser history +
+||[m]L[m]|| Go forward in the browser history +
+||[m]M[m]|| Add new QuickMark for current URL +
+||[m]N[m]|| Find previous +
+||[m]O[m]|| Open one or more URLs, based on current location +
+||[m]P[m]|| Open (put) a URL based on the current clipboard contents in a new buffer +
+||[m]R[m]|| Reload while skipping the cache +
+||[m]T[m]|| Open one or more URLs in a new tab, based on current location +
+||[m]Y[m]|| Copy selected text or current word +
+
+||[m]a[m]|| Open a prompt to bookmark the current URL +
+||[m]b[m]|| Open a prompt to switch buffers +
+||[m]d[m]|| Delete current buffer +
+||[m]f[m]|| Start QuickHint mode +
+||[m]h[m]|| Scroll document to the left +
+||[m]i[m]|| Start Caret mode +
+||[m]j[m]|| Scroll document down +
+||[m]k[m]|| Scroll document up +
+||[m]l[m]|| Scroll document to the right +
+||[m]m[m]|| Set mark at the cursor position +
+||[m]n[m]|| Find next +
+||[m]o[m]|| Open one or more URLs +
+||[m]p[m]|| Open (put) a URL based on the current clipboard contents in the current buffer +
+||[m]q[m]|| Record a key sequence into a macro +
+||[m]r[m]|| Reload current page +
+||[m]t[m]|| Open one or more URLs in a new tab +
+||[m]u[m]|| Undo closing of a tab +
+||[m]y[m]|| Yank current location to the clipboard +
+
+||[m];[m]|| Start an extended hint mode +
+
+||[m]:[m]|| Enter Command-line mode +
+
+||[m]~[m]|| Open home directory +
+
+||[m]/[m]|| Search forward for a pattern +
+||[m]?[m]|| Search backwards for a pattern +
+||[m]*[m]|| Find word under cursor +
+||[m]#[m]|| Find word under cursor backwards +
+
+||[m]N%[m]|| Scroll to {count} percent of the document +
+
+||[m]'[m]|| Jump to the mark in the current buffer +
+
+||[m]@[m]|| Play a macro +
+
+||[m].[m]|| Repeat the last keyboard command +
+
+||[m]]f[m]|| Focus next frame +
+||[m][f[m]|| Focus previous frame +
+||[m]]] [m]|| Follow the link labeled \'next' or \'>' if it exists +
+||[m][[ [m]|| Follow the link labeled \'prev', \'previous' or \'<' if it exists +
+
+||[m]g$[m]|| Go to the last tab +
+||[m]g<[m]|| Redisplay the last command output +
+||[m]g0[m]|| Go to the first tab +
+||[m]g<C-g>[m]|| Print file information +
+||[m]gB[m]|| Repeat last [c]:buffer[!][c] command in reverse direction +
+||[m]gF[m]|| View source with an external editor +
+||[m]gH[m]|| Open homepage in a new tab +
+||[m]gP[m]|| Open (put) a URL based on the current clipboard contents in a new buffer +
+||[m]gT[m]|| Go to previous tab +
+||[m]gU[m]|| Go to the root of the website +
+||[m]gb[m]|| Repeat last [c]:buffer[!][c] command +
+||[m]gf[m]|| View source +
+||[m]gg[m]|| Go to the top of the document +
+||[m]gh[m]|| Open homepage +
+||[m]gi[m]|| Focus last used input field +
+||[m]gn[m]|| Jump to a QuickMark in a new tab +
+||[m]go[m]|| Jump to a QuickMark +
+||[m]gt[m]|| Go to the next tab +
+||[m]gu[m]|| Go to parent directory +
+
+||[m]ZQ[m]|| Quit and don't save the session +
+||[m]ZZ[m]|| Quit and save the session +
+||[m]zI[m]|| Enlarge full zoom of current web page +
+||[m]zM[m]|| Enlarge full zoom of current web page by a larger amount +
+||[m]zO[m]|| Reduce full zoom of current web page +
+||[m]zR[m]|| Reduce full zoom of current web page by a larger amount +
+||[m]zZ[m]|| Set full zoom value of current web page +
+||[m]zi[m]|| Enlarge text zoom of current web page +
+||[m]zm[m]|| Enlarge text zoom of current web page by a larger amount +
+||[m]zo[m]|| Reduce text zoom of current web page +
+||[m]zr[m]|| Reduce text zoom of current web page by a larger amount +
+||[m]zz[m]|| Set text zoom value of current web page +
+
+section:Command-line{nbsp}editing[ex-edit-index]
+
+||[m]<C-c>[m]|| Quit Command-line mode without executing +
+
+||[m]<C-]>[m]|| Expand a command-line abbreviation +
+
+||[m]<Up>[m]|| Recall the previous command line from the history list which matches the current command line +
+||[m]<Down>[m]|| Recall the next command line from the history list which matches the current command line +
+
+||[m]<Tab>[m]|| Complete the word in front of the cursor according to the behavior specified in 'wildmode' +
+||[m]<S-Tab>[m]|| Complete the previous full match when 'wildmode' contains "full" +
+
+section:Ex{nbsp}commands[ex-cmd-index,:index]
+
+||[c]:![c]|| Run a command +
+||[c]:abbreviate[c]|| Abbreviate a key sequence +
+||[c]:abclear[c]|| Remove all abbreviations +
+||[c]:addons[c]|| Manage available Extensions and Themes +
+||[c]:autocmd[c]|| Execute commands automatically on events +
+||[c]:back[c]|| Go back in the browser history +
+||[c]:bdelete[c]|| Delete current buffer +
+||[c]:beep[c]|| Play a system beep +
+||[c]:bmark[c]|| Add a bookmark +
+||[c]:bmarks[c]|| List or open multiple bookmarks +
+||[c]:buffer[c]|| Switch to a buffer +
+||[c]:buffers[c]|| Show a list of all buffers +
+||[c]:cabbrev[c]|| Abbreviate a key sequence in Command-line mode +
+||[c]:cabclear[c]|| Remove all abbreviations in Command-line mode +
+||[c]:cd[c]|| Change the current directory +
+||[c]:cmap[c]|| Map a key sequence in Command-line mode +
+||[c]:cmapclear[c]|| Remove all mappings in Command-line mode +
+||[c]:cnoremap[c]|| Map a key sequence without remapping keys in Command-line mode +
+||[c]:colorscheme[c]|| Load a color scheme +
+||[c]:comclear[c]|| Delete all user-defined commands +
+||[c]:command[c]|| List and define commands +
+||[c]:cunabbrev[c]|| Remove an abbreviation in Command-line mode +
+||[c]:cunmap[c]|| Remove a mapping in Command-line mode +
+||[c]:delbmarks[c]|| Delete a bookmark +
+||[c]:delcommand[c]|| Delete the specified user-defined command +
+||[c]:delmacros[c]|| Delete macros +
+||[c]:delmarks[c]|| Delete the specified marks +
+||[c]:delqmarks[c]|| Delete the specified QuickMarks +
+||[c]:delstyle[c]|| Delete any matching styles +
+||[c]:dialog[c]|| Open a undefined dialog +
+||[c]:doautoall[c]|| Apply the autocommands matching the specified URL to all buffers +
+||[c]:doautocmd[c]|| Apply the autocommands matching the specified URL to the current buffer +
+||[c]:downloads[c]|| Show progress of current downloads +
+||[c]:echo[c]|| Echo the expression +
+||[c]:echoerr[c]|| Echo the expression as an error message +
+||[c]:echomsg[c]|| Echo the expression as an informational message +
+||[c]:emenu[c]|| Execute the specified menu item from the command line +
+||[c]:execute[c]|| Execute the argument as an Ex command +
+||[c]:exusage[c]|| List all Ex commands with a short description +
+||[c]:finish[c]|| Stop sourcing a script file +
+||[c]:forward[c]|| Go forward in the browser history +
+||[c]:hardcopy[c]|| Print current document +
+||[c]:help[c]|| Display help +
+||[c]:highlight[c]|| Style Vimperator +
+||[c]:history[c]|| Show recently visited URLs +
+||[c]:iabbrev[c]|| Abbreviate a key sequence in Insert mode +
+||[c]:iabclear[c]|| Remove all abbreviations in Insert mode +
+||[c]:imap[c]|| Map a key sequence in Insert mode +
+||[c]:imapclear[c]|| Remove all mappings in Insert mode +
+||[c]:inoremap[c]|| Map a key sequence without remapping keys in Insert mode +
+||[c]:iunabbrev[c]|| Remove an abbreviation in Insert mode +
+||[c]:iunmap[c]|| Remove a mapping in Insert mode +
+||[c]:javascript[c]|| Run a JavaScript command through eval() +
+||[c]:jumps[c]|| Show jumplist +
+||[c]:let[c]|| Set or list a variable +
+||[c]:loadplugins[c]|| Immediately load all unloaded plugins +
+||[c]:macros[c]|| List all macros +
+||[c]:map[c]|| Map a key sequence +
+||[c]:mapclear[c]|| Remove all mappings +
+||[c]:mark[c]|| Mark current location within the web page +
+||[c]:marks[c]|| Show all location marks of current web page +
+||[c]:messages[c]|| Display previously given messages +
+||[c]:mkvimperatorrc[c]|| Write current key mappings and changed options to the config file +
+||[c]:nohlsearch[c]|| Remove the search highlighting +
+||[c]:noremap[c]|| Map a key sequence without remapping keys +
+||[c]:normal[c]|| Execute Normal mode commands +
+||[c]:open[c]|| Open one or more URLs in the current tab +
+||[c]:optionusage[c]|| List all options with a short description +
+||[c]:pageinfo[c]|| Show various page information +
+||[c]:pagestyle[c]|| Select the author style sheet to apply +
+||[c]:play[c]|| Replay a recorded macro +
+||[c]:preferences[c]|| Show Firefox preferences dialog +
+||[c]:pwd[c]|| Print the current directory name +
+||[c]:qmark[c]|| Mark a URL with a letter for quick access +
+||[c]:qmarks[c]|| Show all QuickMarks +
+||[c]:quit[c]|| Quit current tab +
+||[c]:quitall[c]|| Quit undefined +
+||[c]:redraw[c]|| Redraw the screen +
+||[c]:reload[c]|| Reload current page +
+||[c]:reloadall[c]|| Reload all tab pages +
+||[c]:restart[c]|| Force undefined to restart +
+||[c]:runtime[c]|| Source the specified file from each directory in 'runtimepath' +
+||[c]:saveas[c]|| Save current document to disk +
+||[c]:sbclose[c]|| Close the sidebar window +
+||[c]:scriptnames[c]|| List all sourced script names +
+||[c]:set[c]|| Set an option +
+||[c]:setglobal[c]|| Set global option +
+||[c]:setlocal[c]|| Set local option +
+||[c]:sidebar[c]|| Open the sidebar window +
+||[c]:style[c]|| Style Vimperator and web sites +
+||[c]:source[c]|| Read Ex commands from a file +
+||[c]:stop[c]|| Stop loading +
+||[c]:tab[c]|| Execute a command and tell it to output in a new tab +
+||[c]:tabdetach[c]|| Detach current tab to its own window +
+||[c]:tabduplicate[c]|| Duplicate current tab +
+||[c]:tablast[c]|| Switch to the last tab +
+||[c]:tabmove[c]|| Move the current tab after tab N +
+||[c]:tabnext[c]|| Switch to the next or [count]th tab +
+||[c]:tabonly[c]|| Close all other tabs +
+||[c]:tabopen[c]|| Open one or more URLs in a new tab +
+||[c]:tabprevious[c]|| Switch to the previous tab or go [count] tabs back +
+||[c]:tabrewind[c]|| Switch to the first tab +
+||[c]:time[c]|| Profile a piece of code or run a command multiple times +
+||[c]:unabbreviate[c]|| Remove an abbreviation +
+||[c]:undo[c]|| Undo closing of a tab +
+||[c]:undoall[c]|| Undo closing of all closed tabs +
+||[c]:unlet[c]|| Delete a variable +
+||[c]:unmap[c]|| Remove a mapping +
+||[c]:version[c]|| Show version information +
+||[c]:viewsource[c]|| View source code of current document +
+||[c]:viusage[c]|| List all mappings with a short description +
+||[c]:winclose[c]|| Close window +
+||[c]:winopen[c]|| Open one or more URLs in a new window +
+||[c]:wqall[c]|| Save the session and quit +
+||[c]:zoom[c]|| Set zoom value of current web page +
+
+section:Options[option-index]
+
+||'activate'|| Define when tabs are automatically activated +
+||'cdpath'|| List of directories searched when executing [c]:cd[c] +
+||'complete'|| Items which are completed at the [c]:[tab]open prompt[c] +
+||'defsearch'|| Set the default search engine +
+||'editor'|| Set the external text editor +
+||'errorbells'|| Ring the bell when an error message is displayed +
+||'eventignore'|| List of autocommand event names which should be ignored +
+||'exrc'|| Allow reading of an RC file in the current directory +
+||'extendedhinttags'|| XPath string of hintable elements activated by [m];[m] +
+||'focuscontent'|| Try to stay in Normal mode after loading a web page +
+||'followhints'|| Change the behaviour of [m]<Return>[m] in Hints mode +
+||'fullscreen'|| Show the current window fullscreen +
+||'guioptions'|| Show or hide certain GUI elements like the menu or toolbar +
+||'helpfile'|| Name of the main help file +
+||'hintmatching'|| How links are matched +
+||'hinttags'|| XPath string of hintable elements activated by [m]f[m] and [m]F[m] +
+||'hinttimeout'|| Timeout before automatically following a non-unique numerical hint +
+||'history'|| Number of Ex commands and search patterns to store in the command-line history +
+||'hlsearch'|| Highlight previous search pattern matches +
+||'ignorecase'|| Ignore case in search patterns +
+||'incsearch'|| Show where the search pattern matches as it is typed +
+||'insertmode'|| Use Insert mode as the default for text areas +
+||'laststatus'|| Show the status line +
+||'linksearch'|| Limit the search to hyperlink text +
+||'loadplugins'|| Load plugin scripts when starting up +
+||'messages'|| Number of messages to store in the message history +
+||'more'|| Pause the message list window when more than one screen of listings is displayed +
+||'newtab'|| Define which commands should output in a new tab by default +
+||'nextpattern'|| Patterns to use when guessing the \'next' page in a document sequence +
+||'online'|| Set the \'work offline' option +
+||'pageinfo'|| Desired info on [c]:pa[geinfo][c] +
+||'popups'|| Where to show requested popup windows +
+||'preload'|| Speed up first time history/bookmark completion +
+||'previouspattern'|| Patterns to use when guessing the \'previous' page in a document sequence +
+||'runtimepath'|| List of directories searched for runtime files +
+||'scroll'|| Number of lines to scroll with [m]<C-u>[m] and [m]<C-d>[m] commands +
+||'shell'|| Shell to use for executing [c]:![c] and [c]:run[c] commands +
+||'shellcmdflag'|| Flag passed to shell when executing [c]:![c] and [c]:run[c] commands +
+||'showmode'|| Show the current mode in the command line +
+||'showstatuslinks'|| Show the destination of the link under the cursor in the status bar +
+||'showtabline'|| Control when to show the tab bar of opened web pages +
+||'smartcase'|| Override the 'ignorecase' option if the pattern contains uppercase characters +
+||'suggestengines'|| Engine Alias which has a feature of suggest +
+||'titlestring'|| Change the title of the window +
+||'urlseparator'|| Set the separator regexp used to separate multiple URL args +
+||'usermode'|| Show current website with a minimal style sheet to make it easily accessible +
+||'verbose'|| Define which info messages are displayed +
+||'visualbell'|| Use visual bell instead of beeping on errors +
+||'wildcase'|| Completion case matching mode +
+||'wildignore'|| List of file patterns to ignore when completing files +
+||'wildmode'|| Define how command-line completion works +
+||'wildoptions'|| Change how command-line completion is done +
+||'wordseparators'|| How words are split for hintmatching +
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/insert.txt b/xulmus/locale/en-US/insert.txt
new file mode 100755
index 00000000..c49d440e
--- /dev/null
+++ b/xulmus/locale/en-US/insert.txt
@@ -0,0 +1,30 @@
+HEADER
+
+|Insert-mode| |Insert| |mode-insert| +
+
+Insert mode is used to enter text in text boxes and text areas. When
+'insertmode' is set, focusing on a text area immediately switches to
+Insert mode.
+
+|i| +
+||i||
+________________________________________________________________________________
+Starts Insert mode in text areas when 'insertmode' is not set.
+________________________________________________________________________________
+
+
+section:Insert-mode{nbsp}special{nbsp}keys[ins-special-keys]
+
+|i_<C-i>| +
+||<C-i>||
+________________________________________________________________________________
+Launch the external editor. See the 'editor' option.
+________________________________________________________________________________
+
+|i_<C-]>| +
+||<C-]>||
+________________________________________________________________________________
+Expand an Insert-mode abbreviation.
+________________________________________________________________________________
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/intro.txt b/xulmus/locale/en-US/intro.txt
new file mode 100755
index 00000000..98c9a70d
--- /dev/null
+++ b/xulmus/locale/en-US/intro.txt
@@ -0,0 +1,115 @@
+LOGO
+
++++<div style="text-align: center;">+++
+*First there was a Navigator, then there was an Explorer.
+Later it was time for a Konqueror. Now it's time for an Imperator, the
+VIMperator :)*
++++</div>+++
+
+section:Introduction[intro]
+
+http://vimperator.org[Vimperator] is a free browser add-on for Firefox,
+which makes it look and behave like the http://www.vim.org[Vim]
+text editor. It has similar key bindings, and you could call it a modal
+web browser, as key bindings differ according to which mode you are in.
+
+|warning| +
+Warning:
+To provide the most authentic Vim experience, the Firefox menubar and toolbar
+are hidden. +
+If you really need them, type: [c]:set guioptions+=mT[c] to get them back. +
+If you don't like Vimperator at all, you can uninstall it by typing
+[c]:addons[c] and remove/disable it. +
+If you like it but can't remember the shortcuts, then press [m]F1[m] or
+[c]:help[c] to get this help window back.
+
+|author| |donation| +
+Vimperator was written by mailto:stubenschrott@gmx.net[Martin Stubenschrott].
+If you appreciate my work on Vimperator and want to encourage me working on it
+more, you can either send me greetings, patches or make a donation:
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+<!-- the PAYPAL code -->
+<form style="text-align: center;" action="https://www.paypal.com/cgi-bin/webscr" method="post"><fieldset class="paypal">
+<input type="hidden" name="cmd" value="_s-xclick"/>
+<input type="image" src="chrome://liberator/content/x-click-but21.gif" name="submit" alt="Make payments with PayPal - it\'s fast, free and secure!"/>
+<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----MIIHPwYJKoZIhvcNAQcEoIIHMDCCBywCAQExggEwMIIBLAIBADCBlDCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20CAQAwDQYJKoZIhvcNAQEBBQAEgYBDDJfc+lXLBSAM9XSWv/ebzG/L7PTqYiIXaWVg8pfinDsfYaAcifcgCTuApg4v/VaZIQ/hLODzQu2EvmjGXP0twErA/Q8G5gx0l197PJSyVXb1sLwd1mgOdLF4t0HmDCdEI9z3H6CMhsb3xVwlfpzllSfCIqzlSpx4QtdzEZGzLDELMAkGBSsOAwIaBQAwgbwGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQI8ZOwn5QkHgaAgZjjtPQxB7Vw2rS7Voap9y+xdVLoczUQ97hw+bOdZLcGykBtfoVjdn76MS51QKjGp1fEmxkqTuQ+Fxv8+OVtHu0QF/qlrhmC3fJBRJ0IFWxKdXS+Wod4615BDaG2X1hzvCL443ffka8XlLSiFTuW43BumQs/O+6Jqsk2hcReP3FIQOvtWMSgGTALnZx7x5c60u/3NSKW5qvyWKCCA4cwggODMIIC7KADAgECAgEAMA0GCSqGSIb3DQEBBQUAMIGOMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC1BheVBhbCBJbmMuMRMwEQYDVQQLFApsaXZlX2NlcnRzMREwDwYDVQQDFAhsaXZlX2FwaTEcMBoGCSqGSIb3DQEJARYNcmVAcGF5cGFsLmNvbTAeFw0wNDAyMTMxMDEzMTVaFw0zNTAyMTMxMDEzMTVaMIGOMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC1BheVBhbCBJbmMuMRMwEQYDVQQLFApsaXZlX2NlcnRzMREwDwYDVQQDFAhsaXZlX2FwaTEcMBoGCSqGSIb3DQEJARYNcmVAcGF5cGFsLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwUdO3fxEzEtcnI7ZKZL412XvZPugoni7i7D7prCe0AtaHTc97CYgm7NsAtJyxNLixmhLV8pyIEaiHXWAh8fPKW+R017+EmXrr9EaquPmsVvTywAAE1PMNOKqo2kl4Gxiz9zZqIajOm1fZGWcGS0f5JQ2kBqNbvbg2/Za+GJ/qwUCAwEAAaOB7jCB6zAdBgNVHQ4EFgQUlp98u8ZvF71ZP1LXChvsENZklGswgbsGA1UdIwSBszCBsIAUlp98u8ZvF71ZP1LXChvsENZklGuhgZSkgZEwgY4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLUGF5UGFsIEluYy4xEzARBgNVBAsUCmxpdmVfY2VydHMxETAPBgNVBAMUCGxpdmVfYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwuY29tggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAgV86VpqAWuXvX6Oro4qJ1tYVIT5DgWpE692Ag422H7yRIr/9j/iKG4Thia/Oflx4TdL+IFJBAyPK9v6zZNZtBgPBynXb048hsP16l2vi0k5Q2JKiPDsEfBhGI+HnxLXEaUWAcVfCsQFvd2A1sxRr67ip5y2wwBelUecP3AjJ+YcxggGaMIIBlgIBATCBlDCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20CAQAwCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTA3MDMyMTIyMzI1OFowIwYJKoZIhvcNAQkEMRYEFCirrvlwYVHQiNEEbM6ikfx9+Dm5MA0GCSqGSIb3DQEBAQUABIGAtbsR8GdCdURLziozXLSdtY+zJZUPPeQFXXy2V1S/3ldiN+pRvd4HI7xz8mOY1UaKJZpwZnOosy9MflL1/hbiEtEyQ2Dm/s4jnTcJng/NjLIZu+0NYxXRJhB+zMJubnMMMjzNrGlqI4F2HAB/bCA1eOJ5B83Of3dA4rk/T/8GoSQ=-----END PKCS7-----"/>
+</fieldset></form>
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+Of course as a believer in free open source software, only make a donation
+if you really like Vimperator and the money doesn't hurt -- otherwise just use
+it, recommend it and like it :)
+
+section:Help{nbsp}topics[overview]
+
+- help:Tutorial[tutorial.html]: A quick-start tutorial for new users.
+- help:Initialization[starting.html]: How Vimperator starts up, where it reads
+ the config file...
+- help:Browsing[browsing.html]: Basic mappings and commands needed for a
+ browsing session (how to open a web page or go back in history).
+- help:Buffer{nbsp}commands[buffer.html]: Operations on the current document
+ like scrolling or copying text.
+- help:Command-line[cmdline.html]: Command-line editing.
+- help:Insert-mode[insert.html]: Insert-mode editing.
+- help:Options[options.html]: A description of all options.
+- help:Search{nbsp}commands[pattern.html]: Searching for text in the
+ current buffer.
+- help:Tabs[tabs.html]: Managing your tabbed browsing session.
+- help:Hints[hints.html]: Selecting hyperlinks.
+- help:Key{nbsp}mapping{nbsp}and{nbsp}abbreviations[map.html]: Defining new key
+ mappings, abbreviations and user commands.
+- help:Expression{nbsp}evaluation[eval.html]: Executing JavaScript.
+- help:Marks[marks.html]: Using bookmarks, QuickMarks, history and local marks.
+- help:Repeating{nbsp}commands[repeat.html]: Using macros to repeat recurring workflows.
+- help:Autocommands[autocommands.html]: Automatically executing code on certain
+ events.
+- help:Print[print.html]: Printing pages.
+- help:GUI[gui.html]: Accessing Firefox menus, dialogs and the sidebar.
+- help:Styling[styling.html]: Changing the styling of content pages and Vimperator itself.
+- help:Messages[message.html]: A description of messages and error messages.
+- help:Developer{nbsp}information[developer.html]: How to write docs or
+ plugins.
+- help:Various[various.html]: Other help which didn't fit into any other
+ category.
+- help:Index[index.html]: An index of all commands and options.
+
+You can also jump directly to the help of a specific command with [c]:help o[c]
+or [c]:help :set[c].
+
+section:Features[features]
+
+* Vim-like keybindings ([m]h[m], [m]j[m], [m]k[m], [m]l[m],
+ [m]gg[m], [m]G[m], [m]0[m], [m]$[m], [m]ZZ[m], [m]<C-f>[m], etc.)
+* Ex commands ([c]:quit[c], [c]:open www.foo.com[c], ...)
+* Tab completion available for all commands with support for 'longest' matching when set in 'wildmode'
+* Hit-a-hint like navigation of links (start with [m]f[m] to follow a link)
+* Advanced completion of bookmark and history URLs (searching also in title, not only URL)
+* Vim-like statusline with a wget-like progress bar
+* Minimal GUI (easily hide useless menubar and toolbar with [c]:set guioptions=[c])
+* Ability to [c]:source[c] JavaScript files, and to use a [a]~/.vimperatorrc[a] file
+ with syntax highlighting if you install scripts/vimperator.vim
+* Easy quick searches ([c]:open foo[c] will search for "foo" in google,
+ [c]:open ebay terminator[c] will search for "terminator" on ebay)
+ with support for Firefox keyword bookmarks and search engines
+* Count supported for many commands ([m]3<C-o>[m] will go back 3 pages)
+* Beep on errors
+* Marks support ([m]ma[m] to set mark a on a web page, [m]'a[m] to go there)
+* QuickMarks support (quickly go to previously marked web pages with [m]go[m][a]\\{a-zA-Z0-9\\}[a])
+* [c]:map[c] and [c]:command[c] support (and feedkeys() for script writers)
+* [c]:time[c] support for profiling
+* Move the text cursor and select text with Vim keys and a Visual mode
+* External editor support
+* Macros to replay key strokes
+* AutoCommands to execute action on certain events
+* A comprehensive help file, explaining all commands, mappings and options.
+
+section:Contact[contact]
+
+Please send comments/bug reports/patches to the mailing list, where I will
+properly answer any questions. You can also join the #vimperator IRC channel
+on irc.freenode.net or check the Wiki for frequently asked questions. Make
+sure, you have read the TODO file first, as I am aware of many things which
+can be improved when I find time for it or get patches.
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/map.txt b/xulmus/locale/en-US/map.txt
new file mode 100755
index 00000000..4e9af03a
--- /dev/null
+++ b/xulmus/locale/en-US/map.txt
@@ -0,0 +1,413 @@
+HEADER
+
+Key mappings, abbreviations, and user-defined commands.
+
+section:Key{nbsp}mapping[key-mapping,mapping,macro]
+
+The key mapping commands can be used to either redefine the standard key
+bindings or define new ones. A mapping consists of a key, or sequence of keys,
+which are translated to a string of characters. Example:
+
+ :map <F2> :echo new Date().toDateString()<CR>
+
+will echo the current date to the command line when [m]<F2>[m] is pressed.
+
+There are separate key mapping tables for each of the Normal, Insert, and
+Command-line modes.
+
+|:map-special-chars| +
+
+|<Nop>| +
+||<Nop>||
+________________________________________________________________________________
+Do nothing. This command is useful for disabling a specific mapping. [c]:map
+<C-n> <Nop>[c] will prevent [m]<C-n>[m] from doing anything.
+________________________________________________________________________________
+
+
+|<CR>| |map_return| +
+||<CR>||
+________________________________________________________________________________
+Expand to a line terminator in a key mapping. An Ex command in the {rhs} of a
+mapping requires a line terminator after it so that it is executed when the
+mapping is expanded. [m]<CR>[m] should be used for this purpose.
+________________________________________________________________________________
+
+
+|<Leader>| |mapleader| +
+||<Leader>||
+________________________________________________________________________________
+Expands to the value of the "mapleader" variable in key mapping. If
+"mapleader" is unset or empty then "\" is used. Example: +
+\{nbsp}[c]:map <Leader>h :echo "Hello"<CR>[c] +
+works like +
+\{nbsp}[c]:map \h :echo "Hello"<CR>[c] +
+but after +
+\{nbsp}[c]let mapleader = ","[c] +
+it works like +
+\{nbsp}[c]:map ,h :echo "Hello"<CR>[c]
+________________________________________________________________________________
+
+
+|:map|
+||:map {lhs} {rhs}|| +
+||:map {lhs}|| +
+||:map||
+________________________________________________________________________________
+Map the key sequence {lhs} to {rhs}. The {rhs} is remapped, allowing for
+nested and recursive mappings.
+
+Warning: Mappings are NOT saved between sessions, make sure you put them in your
+vimperatorrc file!
+________________________________________________________________________________
+
+
+|:cm| |:cmap|
+||:cmap {lhs} {rhs}|| +
+||:cmap {lhs}|| +
+||:cmap||
+________________________________________________________________________________
+Map the key sequence {lhs} to {rhs} (in Command-line mode). The {rhs} is
+remapped, allowing for nested and recursive mappings.
+
+Warning: Mappings are NOT saved between sessions, make sure you put them in your
+vimperatorrc file!
+________________________________________________________________________________
+
+
+|:im| |:imap|
+||:imap {lhs} {rhs}|| +
+||:imap {lhs}|| +
+||:imap||
+________________________________________________________________________________
+Map the key sequence {lhs} to {rhs} (in Insert mode). The {rhs} is remapped,
+allowing for nested and recursive mappings.
+
+Warning: Mappings are NOT saved between sessions, make sure you put them in your
+vimperatorrc file!
+________________________________________________________________________________
+
+
+|:mapc| |:mapclear| +
+||:mapc[lear]||
+________________________________________________________________________________
+Remove all mappings. All user-defined mappings which were set by [c]:map[c] or
+[c]:noremap[c] are cleared.
+________________________________________________________________________________
+
+
+|:cmapc| |:cmapclear| +
+||:cmapc[lear]||
+________________________________________________________________________________
+Remove all mappings (in Command-line mode). All user-defined mappings which
+were set by [c]:cmap[c] or [c]:cnoremap[c] are cleared.
+________________________________________________________________________________
+
+
+|:imapc| |:imapclear| +
+||:imapc[lear]||
+________________________________________________________________________________
+Remove all mappings (in Insert mode). All user-defined mappings which were set
+by [c]:imap[c] or [c]:inoremap[c] are cleared.
+________________________________________________________________________________
+
+
+|:no| |:noremap| +
+||:no[remap] {lhs} {rhs}|| +
+||:no[remap] {lhs}|| +
+||:no[remap]||
+________________________________________________________________________________
+Map the key sequence {lhs} to {rhs}. No remapping of the {rhs} is performed.
+________________________________________________________________________________
+
+
+|:cno| |:cnoremap| +
+||:cno[remap] {lhs} {rhs}|| +
+||:cno[remap] {lhs}|| +
+||:cno[remap]||
+________________________________________________________________________________
+Map the key sequence {lhs} to {rhs} (in Command-line mode). No remapping of
+the {rhs} is performed.
+________________________________________________________________________________
+
+
+|:ino| |:inoremap| +
+||:ino[remap] {lhs} {rhs}|| +
+||:ino[remap] {lhs}|| +
+||:ino[remap]||
+________________________________________________________________________________
+Map the key sequence {lhs} to {rhs} (in Insert mode). No remapping of the
+{rhs} is performed.
+________________________________________________________________________________
+
+
+|:map-<silent>| +
+________________________________________________________________________________
+When the first argument to one of the mapping commands is <silent>,
+{rhs} is not echoed to the command line, nor, for that matter, anything
+else until the command has completed.
+________________________________________________________________________________
+
+
+
+|:unm| |:unmap| +
+||:unm[ap] {lhs}||
+________________________________________________________________________________
+Remove the mapping of {lhs}.
+________________________________________________________________________________
+
+
+|:cunm| |:cunmap| +
+||:cunm[ap] {lhs}||
+________________________________________________________________________________
+Remove the mapping of {lhs} (in Command-line mode).
+________________________________________________________________________________
+
+
+|:iunm| |:iunmap| +
+||:iunm[ap] {lhs}||
+________________________________________________________________________________
+Remove the mapping of {lhs} (in Insert mode).
+________________________________________________________________________________
+
+section:Abbreviations[abbreviations]
+
+Vimperator can automatically replace words identified as abbreviations,
+which may be used to save typing or to correct commonly misspelled
+words. An abbreviation can be one of three types that are defined by the
+types of constituent characters. Whitespace and quotes are non-keyword
+types, and all other characters are keyword types.
+
+1. A "full-id" abbreviation consists entirely of keyword characters
+(e.g., "teh", "msoft").
+
+2. An "end-id" abbreviation ends in keyword character but otherwise
+contains all non-keyword characters (e.g., "'i").
+
+3. A "non-id" abbreviation ends in a non-keyword character but otherwise
+contains any non-whitespace character (e.g., "def'").
+
+Strings that cannot be abbreviations include "a'b" and "a b".
+
+An abbreviation is recognized when a space, quote character, or
+[m]<C-]>[m] is typed after the abbreviation. There are no default
+abbreviations, and abbreviations are never recursive.
+
+|:ab| |:abbreviate|
+||:ab[breviate] {lhs} {rhs}|| +
+||:ab[breviate] {lhs}|| +
+||:ab[breviate]||
+________________________________________________________________________________
+Abbreviate a key sequence. Abbreviate {lhs} to {rhs}. If only {lhs} is given,
+list all abbreviations that start with {lhs}. If no arguments are given,
+list all abbreviations.
+________________________________________________________________________________
+
+
+|:ca| |:cabbrev|
+||:ca[bbrev] {lhs} {rhs}|| +
+||:ca[bbrev] {lhs}|| +
+||:ca[bbrev]||
+________________________________________________________________________________
+Abbreviate a key sequence for Command-line mode. Same as [c]:ab[reviate][c],
+but for Command-line mode only.
+________________________________________________________________________________
+
+
+|:ia| |:iabbrev|
+||:ia[bbrev] {lhs} {rhs}|| +
+||:ia[bbrev] {lhs}|| +
+||:ia[bbrev]||
+________________________________________________________________________________
+Abbreviate a key sequence for Insert mode. Same as [c]:ab[breviate][c] but
+for Insert mode only.
+________________________________________________________________________________
+
+
+|:una| |:unabbreviate|
+||:una[bbreviate] {lhs}|| +
+________________________________________________________________________________
+Remove an abbreviation.
+________________________________________________________________________________
+
+
+|:cuna| |:cunabbrev|
+||:cuna[bbrev] {lhs}|| +
+________________________________________________________________________________
+Remove an abbreviation for Command-line mode. Same as [c]:una[bbreviate][c],
+but for Command-line mode only.
+________________________________________________________________________________
+
+
+|:iuna| |:iunabbrev|
+||:iuna[bbrev] {lhs}|| +
+________________________________________________________________________________
+Remove an abbreviation for Insert mode. Same as [c]:una[bbreviate][c] but for
+Insert mode only.
+________________________________________________________________________________
+
+
+|:abc| |:abclear| +
+||:abc[lear]||
+________________________________________________________________________________
+Remove all abbreviations.
+________________________________________________________________________________
+
+
+|:cabc| |:cabclear| +
+||:cabc[lear]||
+________________________________________________________________________________
+Remove all abbreviations for Command-line mode.
+________________________________________________________________________________
+
+
+|:iabc| |:iabclear| +
+||:iabc[lear]||
+________________________________________________________________________________
+Remove all abbreviations for Insert mode.
+________________________________________________________________________________
+
+section:User-defined{nbsp}commands[user-commands]
+
+|:com| |:command|
+||:com[mand]|| +
+________________________________________________________________________________
+List all user-defined commands.
+________________________________________________________________________________
+
+||:com[mand] {cmd}|| +
+________________________________________________________________________________
+List all user-defined commands that start with {cmd}.
+________________________________________________________________________________
+
+
+||:com[mand][!] [{attr}...] {cmd} {rep}|| +
+________________________________________________________________________________
+Define a new user command. The name of the command is {cmd} and its replacement
+text is {rep}. The command's attributes are {attr}. If a command with this name
+already exists an error is reported unless [!] is specified, in which case the
+command is redefined. Unlike Vim, the command may start with a lowercase
+letter.
+
+The command's behavior can be specified by providing attributes when the
+command is defined.
+
+|E175| |E176| |:command-nargs| +
+Argument handling
+
+By default user commands accept no arguments. This can be changed by specifying
+the -nargs attribute.
+
+The valid values are:
+`----------`--------------------------------------------------------------------
+*-nargs=0* No arguments are allowed (default)
+*-nargs=1* One argument is allowed
+*-nargs=** Zero or more arguments are allowed
+*-nargs=?* Zero or one argument is allowed
+*-nargs=+* One or more arguments are allowed
+--------------------------------------------------------------------------------
+
+|E180| |E181| |:command-complete| +
+Argument completion
+
+Completion for arguments to user defined commands is not available by default.
+Completion can be enabled by specifying one of the following arguments to the
+-complete option when defining the command.
+`----------------`--------------------------------------------------------------
+*altstyle* alternate author style sheets
+*bookmark* bookmarks
+*buffer* buffers
+*color* color schemes
+*command* Ex commands
+*dialog* Firefox dialogs
+*dir* directories
+*environment* environment variables
+*event* autocommand events
+*file* files
+*help* help tags
+*highlight* highlight groups
+*javascript* JavaScript expressions
+*macro* named macros
+*mapping* user mappings
+*menu* menu items
+*option* Vimperator options
+*preference* Firefox preferences
+*search* search engines and keywords
+*shellcmd* shell commands
+*sidebar* sidebar panels
+*url* URLs
+*usercommand* user commands
+*custom,{func}* custom completion, provided by {func}
+--------------------------------------------------------------------------------
+
+|E467| |E468| |:command-completion-custom| +
+Custom completion
+
+Custom completion can be provided by specifying the "custom,{func}" argument to
+-complete. The {func} is called with two arguments, a completion context, and
+an object describing the command's arguments. It should set the context's
+\'completions' property, or return an object, with \'start' and \'items'
+properties, describing the completions and where the replacement is to start.
+
+*start* is the index into the word being completed at which the returned values
+should be applied and *completions* is a two dimensional array of the form:
+[[arg1, description1], [arg2, description2], ...]
+
+// TODO: add examples
+
+|E177| |E178| |:command-count| +
+Count handling
+
+By default user commands do not accept a count. Use the -count attribute if
+you'd like to have a count passed to your user command. This will then be
+available for expansion as <count> in the argument.
+
+|:command-bang| +
+Special cases
+
+By default a user command does not have a special version, i.e. a version
+executed with the ! modifier. Providing the -bang attribute will enable this
+and <bang> will be available in the argument.
+
+|:command-replacement-text| +
+Replacement text
+
+The replacement text {rep} is scanned for escape sequences and these are
+replaced with values from the user-entered command line. The resulting string
+is then executed as an Ex command.
+
+The valid escape sequences are:
+`----------`--------------------------------------------------------------------
+*<args>* The command arguments exactly as supplied
+*<count>* Any supplied count, e.g. 5
+*<bang>* ! if the command was executed with the ! modifier
+*<lt>* A literal '<' character to allow for a literal copy of one of the escape sequences. E.g. <lt>args> will expand to a literal <args>
+--------------------------------------------------------------------------------
+
+"q-" can be prefixed to the escape sequence so that the value is quoted, making
+it suitable for expression evaluation. Example: <q-args>
+________________________________________________________________________________
+
+
+|:comc| |:comclear| +
+||:comc[lear]||
+________________________________________________________________________________
+Delete all user-defined commands.
+________________________________________________________________________________
+
+
+|:delc| |:delcommand|
+||:delc[ommand] {cmd}|| +
+________________________________________________________________________________
+Delete the user-defined command {cmd}.
+________________________________________________________________________________
+
+section:Examples[command-examples]
+
+Add a :Google command to search via google:
+
+ :command -nargs=* Google open google <args>
+
+// TODO: add decent examples
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/marks.txt b/xulmus/locale/en-US/marks.txt
new file mode 100755
index 00000000..837268be
--- /dev/null
+++ b/xulmus/locale/en-US/marks.txt
@@ -0,0 +1,249 @@
+HEADER
+
+|different-marks| |marks| +
+
+Vimperator supports a number of different marks:
+
+- Bookmarks which allow you to mark a web page as one of your favorites for
+ easy access.
+- QuickMarks allow you to define up to 62 (a-zA-Z0-9) web sites (or groups of
+ web sites) which you visit most often.
+- Local marks to store the position within a web page.
+- History is also a special type of marks, as Vimperator automatically
+ remembers sites which you have visited in the past.
+
+section:Bookmarks[bookmarks]
+
+|a| |:bma| |:bmark|
+||:bma[rk][!] [a][-title=title][a] [a][-keyword=kw][a] [a][-tags=tag1,tag2][a] [a][url][a]|| +
+||a||
+____________________________________________________________________________
+Add a bookmark. +
+
+The following options are interpreted:
+
+- -title="custom title" (short option: -t)
+- -tags=comma,separated,tag,list (short option: -T)
+- -keyword=keyword (short option: -k)
+
+If [!] is present, a new bookmark is always added. Otherwise, the first
+bookmark matching [a][url][a] is updated.
+
+When creating a new bookmark, if [a][-title][a] isn't given, either the web
+page's title or URL is used. You can omit the optional [a][url][a] argument, so
+just do [c]:bmark[c] to bookmark the currently loaded web page with a default
+title and without any tags.
+____________________________________________________________________________
+
+
+|A| +
+||A||
+________________________________________________________________________________
+Toggle bookmarked state of current URL. Add/remove a bookmark for the current
+location, depending on if it is already bookmarked or not. In contrast to the
+[c]:bmark[c] command, the bookmark is just _starred_ which means it is placed
+in the _Unfiled Bookmarks Folder_ instead of the bookmarks menu.
+________________________________________________________________________________
+
+
+|:bmarks|
+||:bmarks[!] [a][filter][a]|| +
+________________________________________________________________________________
+List or open multiple bookmarks. Open the message window at the bottom of the
+screen with all bookmarks which match [a][filter][a] either in the title or
+URL.
+
+The special version [c]:bmarks![c] works the same as [c]:bmarks[c] except it
+opens all the found bookmarks in new tabs.
+
+Filter can also contain the following options: +
+-tags=comma,separated,tag,list (short option: -T) +
+-max=N (short options: -m)
+________________________________________________________________________________
+
+
+|:delbm| |:delbmarks|
+||:delbm[arks] [a][url][a]|| +
+________________________________________________________________________________
+Delete a bookmark. Deletes *all* bookmarks which match the [a][url][a]. If
+omitted, [a][url][a] defaults to the URL of the current buffer. Use [m]<Tab>[m]
+key on a string to complete the URL which you want to delete.
+
+The following options WILL be interpreted in the future:
+
+* [!] a special version to delete ALL bookmarks
+________________________________________________________________________________
+
+section:History[history]
+
+|<C-o>| +
+||[count]<C-o>||
+________________________________________________________________________________
+Go to an older position in the jump list. The jump list is just the browser
+history for now.
+________________________________________________________________________________
+
+
+|<C-i>| +
+||[count]<C-i>||
+________________________________________________________________________________
+Go to a newer position in the jump list. The jump list is just the browser
+history for now.
+________________________________________________________________________________
+
+
+|<M-Left>| |<A-Left>| |H| +
+||[count]H||
+________________________________________________________________________________
+Go back in the browser history. If [count] is specified go back [count] pages.
+________________________________________________________________________________
+
+
+|<M-Right>| |<A-Right>| |L| +
+||[count]L||
+________________________________________________________________________________
+Go forward in the browser history. If [count] is specified go forward [count]
+pages.
+________________________________________________________________________________
+
+
+|:ba| |:back|
+||:[count]ba[ck][!] [a][url][a]|| +
+________________________________________________________________________________
+Go back in the browser history. If [count] is specified go back [count] pages. +
+The special version [c]:back![c] goes to the beginning of the browser history.
+________________________________________________________________________________
+
+
+|:fw| |:fo| |:forward|
+||:[count]fo[rward][!] [a][url][a]|| +
+________________________________________________________________________________
+Go forward in the browser history. If [count] is specified go forward [count]
+pages. +
+The special version [c]:forward![c] goes to the end of the browser history.
+________________________________________________________________________________
+
+
+|:hs| |:hist| |:history|
+||:hist[ory][!] [a][filter][a]|| +
+________________________________________________________________________________
+Show recently visited URLs. Open the message window at the bottom of the screen
+with all history items which match [a][filter][a] either in the title or URL.
+
+The special version [c]:history![c] works the same as [c]:history[c] except
+it opens all the found items in new tabs.
+
+Filter can also contain the following options: +
+-max=N (short options: -m)
+________________________________________________________________________________
+
+section:QuickMarks[quickmarks]
+
+|go| +
+||go[a]\\{a-zA-Z0-9\\}[a]||
+________________________________________________________________________________
+Jump to a QuickMark in the current tab. Open any QuickMark in the current tab.
+You can mark any URLs with [m]M[m][a]\\{a-zA-Z0-9\\}[a]. These QuickMarks are
+persistent across browser sessions.
+________________________________________________________________________________
+
+
+|gn| +
+||gn[a]\\{a-zA-Z0-9\\}[a]||
+________________________________________________________________________________
+Jump to a QuickMark in a new tab. Works like [m]go[m][a]\\{a-zA-Z0-9\\}[a] but
+opens the QuickMark in a new tab. Whether the new tab is activated or not
+depends on the 'activate' option. +
+Mnemonic: Go in a new tab. [m]gt[m] would make more sense but is already
+taken.
+________________________________________________________________________________
+
+
+|M| +
+||M[a]\\{a-zA-Z0-9\\}[a]||
+________________________________________________________________________________
+Add new QuickMark for current URL. You can go to a marked URL in the current
+tab with [m]go[m][a]\\{a-zA-Z0-9\\}[a] or in a new tab with
+[m]gn[m][a]\\{a-zA-Z0-9\\}[a]. These QuickMarks are persistent across browser
+sessions.
+________________________________________________________________________________
+
+
+|:delqm| |:delqmarks|
+||:delqm[arks] {marks}|| +
+||:delqm[arks]!||
+________________________________________________________________________________
+Delete the specified QuickMarks. QuickMarks are presented as a list.
+
+Examples:
+
+* [c]:delqmarks Aa b p[c] deletes QuickMarks A, a, b and p +
+* [c]:delqmarks b-p[c] deletes all QuickMarks in the range b to p +
+* [c]:delqmarks![c] deletes all QuickMarks
+
+________________________________________________________________________________
+
+
+|:qma| |:qmark|
+||:qma[rk] {a-zA-Z0-9} [a][url][a]|| +
+________________________________________________________________________________
+Mark a URL with a letter for quick access. You can also mark whole groups like this: +
+[c]:qmark f +++http://forum1.com+++, +++http://forum2.com+++, imdb some artist[c]
+________________________________________________________________________________
+
+
+|:qmarks|
+||:qmarks [a][arg][a]||
+________________________________________________________________________________
+Show all QuickMarks. If [a][arg][a] is specified then limit the list to those
+QuickMarks mentioned.
+________________________________________________________________________________
+
+section:Local{nbsp}marks[localmarks]
+
+|m| +
+||m[a]\\{a-zA-Z\\}[a]||
+________________________________________________________________________________
+Set mark at the cursor position. Marks a-z are local to the buffer, whereas
+A-Z are valid between buffers.
+________________________________________________________________________________
+
+
+|\`| |\'| +
+||\'[a]\\{a-zA-Z\\}[a]||
+________________________________________________________________________________
+Jump to the mark in the current buffer. Marks a-z are local to the buffer,
+whereas A-Z are valid between buffers.
+________________________________________________________________________________
+
+
+|:delm| |:delmarks|
+||:delm[arks] {marks}|| +
+||:delm[arks]!||
+________________________________________________________________________________
+Delete the specified marks. Marks are presented as a list.
+
+Examples:
+
+* [c]:delmarks Aa b p[c] deletes marks A, a, b and p +
+* [c]:delmarks b-p[c] deletes all marks in the range b to p +
+* [c]:delmarks![c] deletes all marks for the current buffer
+
+________________________________________________________________________________
+
+
+|:ma| |:mark|
+||:ma[rk] {a-zA-Z}||
+________________________________________________________________________________
+Mark current location within the web page.
+________________________________________________________________________________
+
+
+|:marks| +
+||:marks [a][arg][a]||
+________________________________________________________________________________
+Show all location marks of the current web page. If [a][arg][a] is specified then
+limit the list to those marks mentioned.
+________________________________________________________________________________
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/message.txt b/xulmus/locale/en-US/message.txt
new file mode 100755
index 00000000..99c1d723
--- /dev/null
+++ b/xulmus/locale/en-US/message.txt
@@ -0,0 +1,22 @@
+HEADER
+
+|message-history| +
+
+Vimperator stores all info and error messages in a message history. The type of
+info messages output can be controlled by the 'verbose' option.
+
+|:mes| |:messages| +
+||:mes[sages]||
+________________________________________________________________________________
+Display previously given messages.
+________________________________________________________________________________
+
+
+|g<| +
+||g<||
+________________________________________________________________________________
+Redisplay the last command output. Only the most recent command's output is
+available.
+________________________________________________________________________________
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/options.txt b/xulmus/locale/en-US/options.txt
new file mode 100755
index 00000000..a16aa9f6
--- /dev/null
+++ b/xulmus/locale/en-US/options.txt
@@ -0,0 +1,815 @@
+HEADER
+
+|options| +
+
+Vimperator has a number of internal variables and switches which can be set to
+achieve special effects. These options come in 5 forms:
+`------------`-----------------------------------------
+*boolean* can only be on or off
+*number* has a numeric value
+*string* has a string value
+*charlist* like a string but with unique characters
+*stringlist* a comma-separated list of strings
+-------------------------------------------------------
+
+section:Setting{nbsp}options[set-option,E764]
+
+|:set| |:se| +
+||:se[t]||
+____
+Show all options that differ from their default value.
+____
+
+||:se[t] all||
+____
+Show all options.
+____
+
+|E518| |E519|
+||:se[t] {option}?||
+____
+Show value of {option}.
+____
+
+||:se[t] {option} [...]||
+____
+Toggle option: set, switch it on. +
+Number option: show value. +
+String option: show value.
+____
+
+||:se[t] no[a]{option}[a] [...]|| +
+____
+Toggle option: Reset, switch it off.
+____
+
+||:se[t] {option}! [...]|| +
+||:se[t] inv[a]{option}[a] [...]|| +
+____
+Toggle option: Invert value.
+____
+
+||:se[t] inv[a]{option}[a]={value} [...]|| +
+||:se[t] {option}!={value} [...]|| +
+____
+For list options, toggle the specified values.
+
+If the option is a list, the given values are toggled. Given +
+\{nbsp}[c]:set opt=foo,bar[c] +
+then, +
+\{nbsp}[c]:set opt!=foo,baz[c] +
+results in +
+\{nbsp}opt=bar,baz
+____
+
+|:set-default|
+||:se[t] {option}& [...]||
+____
+Reset option to its default value.
+____
+
+||:se[t] all&||
+____
+Set all options to their default value.
+____
+
+|:set-args| |E487| |E521|
+||:se[t] {option}={value} [...]|| +
+____
+Set string or number option to {value}. +
+For numeric options the value must be given in decimal.
+The old value can be inserted by typing [m]<Tab>[m].
+____
+
+|:set+=|
+||:se[t] {option}+={value} [...]|| +
+____
+Add the {value} to a number option, or append the {value} to a string option.
+When the option is a comma separated list, a comma is added, unless the value
+was empty. If the option is a list of flags, superfluous flags are removed.
+When adding a flag that was already present the option value doesn't change.
+____
+
+|:set^=|
+||:se[t] {option}^={value} [...]|| +
+____
+Multiply the {value} to a number option, or prepend the {value} to a string
+option. When the option is a comma separated list, a comma is added, unless the
+value was empty.
+____
+
+|:set-=|
+||:se[t] {option}-={value} [...]|| +
+
+____
+Subtract the {value} from a number option, or remove the {value} from a string
+option, if it is there. If the {value} is not found in a string option, there
+is no error or warning. When the option is a comma separated list, a comma is
+deleted, unless the option becomes empty. When the option is a list of flags,
+{value} must be exactly as they appear in the option. Remove flags one by one
+to avoid problems.
+____
+
+|:setlocal| |:setl|
+||:setl[ocal]|| +
+||:setl[ocal] all|| +
+||:setl[ocal] {option}?|| +
+||:setl[ocal] {option}|| +
+||:setl[ocal] no[a]{option}[a]|| +
+||:setl[ocal] inv[a]{option}[a]|| +
+||:setl[ocal] {option}&|| +
+||:setl[ocal] all&|| +
+||:setl[ocal] {option}={value}|| +
+||:setl[ocal] {option}+={value}|| +
+||:setl[ocal] {option}^={value}|| +
+||:setl[ocal] {option}-={value}|| +
+
+____
+The same as [c]:set[c] command, but operates on current tab options
+only. See [c]:set[c] for details.
+____
+
+|:setglobal| |:setg|
+||:setg[lobal]|| +
+||:setg[lobal] all|| +
+||:setg[lobal] {option}?|| +
+||:setg[lobal] {option}|| +
+||:setg[lobal] no[a]{option}[a]|| +
+||:setg[lobal] inv[a]{option}[a]|| +
+||:setg[lobal] {option}&|| +
+||:setg[lobal] all&|| +
+||:setg[lobal] {option}={value}|| +
+||:setg[lobal] {option}+={value}|| +
+||:setg[lobal] {option}^={value}|| +
+||:setg[lobal] {option}-={value}|| +
+
+____
+The same as [c]:set[c] command, but operates on global options only.
+See [c]:set[c] for details.
+____
+
+
+|expand-environment-var| |expand-env| |:set_env| +
+
+Environment variables are expanded for path options like 'cdpath' and
+'runtimepath'. The variable notation is _$VAR_ (terminated by a non-word
+character) or _$\\{VAR}_. _%VAR%_ is also supported on Windows.
+
+section:Setting{nbsp}Firefox{nbsp}options[firefox-options,preferences]
+
+Firefox options can be viewed and set with the following commands:
+
+|:prefs| |:preferences|
+||:pref[erences]||
+________________________________________________________________________________
+Show the Firefox preferences dialog. You can change the browser preferences
+from this dialog. Be aware that not all Firefox preferences work, because
+Vimperator overrides some key bindings and changes Firefox's GUI.
+________________________________________________________________________________
+
+|:prefs!| |:preferences!|
+||:pref[erences]!||
+________________________________________________________________________________
+Opens about:config in the current tab where you can change advanced Firefox
+preferences.
+________________________________________________________________________________
+
+|:set!| |:set-!|
+||:se[t]! {preference}={value}|| +
+________________________________________________________________________________
+Change any Firefox {preference} (those in the about:config window). You can also
+reset/delete those preferences with [c]:set! {preference}&[c].
+________________________________________________________________________________
+
+|overridden-preferences| +
+
+Vimperator sets several Firefox preferences at startup. If this is undesirable,
+they can be changed to a different value in your RC file using
+[c]:set! {preference}={value}[c]
+
+The following preferences are set:
+
+* browser.startup.page
+* dom.popup_allowed_events
+* accessibility.typeaheadfind.autostart
+* accessibility.typeaheadfind
+
+// TODO: others?
+
+section:List{nbsp}of{nbsp}options[list-options]
+
+|\'act'| |\'activate'|
+||'activate' 'act'|| stringlist (default: "homepage,quickmark,tabopen,paste")
+____
+Define when tabs are automatically activated. Available items:
+
+`-----------`--------------------------------
+*homepage* [m]gH[m] mapping
+*quickmark* [m]go[m] and [m]gn[m] mappings
+*tabopen* [c]:tabopen[!][c] command
+*paste* [m]P[m] and [m]gP[m] mappings
+---------------------------------------------
+
+____
+
+
+|$CDPATH|
+|\'cd'| |\'cdpath'|
+||'cdpath' 'cd'|| string (default: equivalent to _$CDPATH_ or ",,")
+____
+List of directories searched when executing the [c]:cd[c] command. This is
+only used for relative paths, if an absolute path is specified then the option
+is ignored.
+____
+
+
+|\'cpt'| |\'complete'|
+||'complete' 'cpt'|| charlist (default: sfl)
+____
+Items which are completed at the [c]:[tab]open[c] prompt. Available items:
+
+`---`--------------------------------------------------------------------------------
+*s* Search engines and keyword URLs
+*f* Local files
+*l* Firefox location bar entries (bookmarks and history sorted in an intelligent way)
+*b* Bookmarks
+*S* Suggest engines
+-------------------------------------------------------------------------------------
+
+The order is important, so [c]:set complete=bs[c] would list bookmarks first,
+and then any available quick searches.
+____
+
+
+|\'ds'| |\'defsearch'|
+||'defsearch' 'ds'|| string (default: "google")
+____
+Sets the default search engine. The default search engine name is used in the
+[c]:[tab]open [arg][c] command if [a][arg][a] neither looks like a URL or like
+a specified search engine/keyword.
+
+This means, it you set 'defsearch' to "youtube", then [c]:open arnold
+schwarzenegger[c] will be exactly the same as [c]:open youtube arnold
+schwarzenegger[c]. Therefore, you need to add a keyword or search engine
+"youtube" first.
+
+If 'defsearch' is empty, then Firefox will always attempt to open the
+raw [a][arg][a].
+____
+
+
+|\'editor'| |i_<C-i>|
+||'editor'|| string (default: "gvim -f")
+____
+Set the external text editor.
+Sets the editor to run when [m]<C-i>[m] is pressed in INSERT and TEXTAREA
+modes.
+
+Warning: Vimperator will not behave correctly if the editor forks its own
+process, such as with gvim without the -f argument.
+____
+
+|\'noex'| |\'noexrc'| |\'ex'| |\'exrc'|
+||'exrc' 'ex'|| boolean (default: off)
+____
+Allow reading of an RC file in the current directory. This file is sourced in
+addition to, and after, your default RC file.
+____
+
+|\'eht'| |\'extendedhinttags'|
+||'extendedhinttags' 'eht'|| string
+____
+(default: +++//*[@onclick or @onmouseover or @onmousedown or @onmouseup or
+@oncommand or @class='lk' or @role='link'] | //input[not(@type='hidden')] | //a
+| //area | //iframe | //textarea | //button | //select |
+//xhtml:input[not(@type='hidden')] | //xhtml:a | //xhtml:area | //xhtml:iframe
+| //xhtml:textarea | //xhtml:button | //xhtml:select+++)
+
+The XPath string of hintable elements activated by [m];[m].
+____
+
+
+|\'noeb'| |\'noerrorbells'| |\'eb'| |\'errorbells'|
+||'errorbells' 'eb'|| boolean (default: off)
+____
+Ring the bell when an error message is displayed.
+____
+
+
+|\'ei'| |\'eventignore'|
+||'eventignore'|| stringlist (default: "")
+____
+A list of autocommand event names which should be ignored. If the list contains
+the value "all" then all events are ignored.
+____
+
+
+|\'nofc'| |\'nofocuscontent'| |\'fc'| |\'focuscontent'|
+||'focuscontent' 'fc'|| boolean (default: off)
+____
+Focus the content after a page has loaded. This is useful, if you always
+want to stay in Normal mode when browsing between web sites. When "on", it
+blurs any textbox which often is automatically focused on page load.
+If you usually like 'focuscontent' but sometimes you'd like to focus the
+first input field, you can use [m]gi[m] to jump to it.
+____
+
+
+|\'nofs'| |\'nofullscreen'| |\'fs'| |\'fullscreen'|
+||'fullscreen' 'fs'|| boolean (default: off)
+____
+Show the current window fullscreen. Also hide certain GUI elements like the
+statusline.
+____
+
+
+|\'go'| |\'guioptions'|
+||'guioptions' 'go'|| charlist (default: "")
+____
+Show or hide certain GUI elements like the menu or toolbar. Supported characters:
+
+`---`-----------
+*m* Menubar
+*T* Toolbar
+*B* Bookmark bar
+*n* Tab number
+*N* Tab number over image
+*b* Bottom scrollbar
+*r* Right scrollbar
+*l* Left scrollbar
+----------------
+
+You can also hide the tab bar with [c]:set showtabline=0[c].
+____
+
+
+|\'hf'| |\'helpfile'|
+||'helpfile' 'hf'|| string (default: "intro.html")
+____
+Name of the main help file. This is the tail component of the chrome URL as
+displayed in the status line when viewing the page.
+____
+
+
+|\'hm'| |\'hintmatching'|
+||'hintmatching' 'hm'|| string (default: contains)
+____
+
+Change the hint matching algorithm during Hints mode. Possible values:
+
+`--------------------`-------------------------------------------------------------------------------------------------------------------------------
+*contains* The typed characters are split on whitespace, and these character groups have to match anywhere inside the text of the link.
+*wordstartswith* The typed characters are matched with the beginning of the first word (see 'wordseparators') in the link as long as possible. If no matches occur in the current word, then the matching is continued at the beginning of the next word. The words are worked through in the order they appear in the link. If the typed characters contain spaces, then the characters are split on whitespace. These character groups are then matched with the beginning of the words, beginning at the first one and continuing with the following words in the order they appear in the link.
+*firstletters* Behaves like wordstartswith, but non-matching words aren't overleaped.
+*custom* Delegate to a custom function: liberator.plugins.customHintMatcher(hintString)
+-----------------------------------------------------------------------------------------------------------------------------------------------------
+
+____
+
+
+|\'fh'| |\'followhints'|
+||'followhints' 'fh'|| number (default: 0)
+____
+
+Change the behaviour of [m]<Return>[m] in Hints mode. Possible values:
+
+`---------`----------------------------------------------------------
+*0* Follow the first hint as soon as typed text uniquely identifies it.
+ Follow the selected hint on [m]<Return>[m].
+*1* Follow the selected hint on [m]<Return>[m].
+*2* Follow the selected hint on [m]<Return>[m] only if it's been [m]<Tab>[m]-selected.
+---------------------------------------------------------------------
+
+____
+
+
+|\'ht'| |\'hinttags'|
+||'hinttags' 'ht'|| string
+____
+(default: +++//*[@onclick or @onmouseover or @onmousedown or @onmouseup or
+@oncommand or @class='lk' or @role='link'] | //input[not(@type='hidden')] | //a
+| //area | //iframe | //textarea | //button | //select |
+//xhtml:input[not(@type='hidden')] | //xhtml:a | //xhtml:area | //xhtml:iframe
+| //xhtml:textarea | //xhtml:button | //xhtml:select+++)
+
+XPath string of hintable elements activated by [m]f[m] and [m]F[m]
+____
+
+
+|\'hto'| |\'hinttimeout'|
+||'hinttimeout' 'hto'|| number (default: 0)
+____
+Timeout before automatically following a non-unique numerical hint. Set to 0
+(the default) to only follow numeric hints after pressing [m]<Return>[m] or
+when the hint is unique.
+____
+
+
+|\'hi'| |\'history'|
+||'history' 'hi'|| number (default: 500)
+____
+Number of Ex commands and search patterns to store in the command-line history.
+____
+
+
+|\'nohls'| |\'nohlsearch'| |\'hls'| |\'hlsearch'|
+||'hlsearch' 'hls'|| boolean (default: off)
+____
+Highlight previous search pattern matches
+____
+
+
+|\'noic'| |\'noignorecase'| |\'ic'| |\'ignorecase'|
+||'ignorecase' 'ic'|| boolean (default: on)
+____
+Ignore case in search patterns.
+____
+
+
+|\'nois'| |\'noincsearch'| |\'is'| |\'incsearch'|
+||'incsearch' 'is'|| boolean (default: on)
+____
+Show where the search pattern matches as it is typed.
+
+Note: Incremental searching currently only works in the forward direction.
+____
+
+
+|\'noim'| |\'noinsertmode'| |\'im'| |\'insertmode'|
+||'insertmode' 'im'|| boolean (default: on)
+____
+Use Insert mode as the default for text areas.
+Makes Vimperator work in a way that Insert mode is the default mode for text areas.
+Useful if you want to use Vimperator as a modeless editor, keeping the known Firefox interface for editing text areas.
+____
+
+
+|\'ls'| |\'laststatus'|
+||'laststatus' 'ls'|| number (default: 2)
+____
+Determines when the last window will have a status line. Possible values:
+
+`---`---------------------------------
+*0* Never
+*1* Only if there are multiple windows
+*2* Always
+--------------------------------------
+
+Note: laststatus=1 not implemented yet.
+____
+
+
+|\'nolks'| |\'nolinksearch'| |\'lks'| |\'linksearch'|
+||'linksearch' 'lks'|| boolean (default: off)
+____
+Limit the search to hyperlink text.
+This includes (X)HTML elements with an "href" atrribute and XLink "simple" links.
+____
+
+
+|\'nolpl'| |\'lpl'| |\'noloadplugins'| |\'loadplugins'|
+||'loadplugins' 'lpl'|| boolean (default on)
+____
+Load plugin scripts when starting up. When on, yet unloaded plugins are
+automatically loaded after the vimperatorrc file has been sourced. To
+load plugins earlier, use the [c]:loadplugins[c] command within the
+vimperatorrc.
+____
+
+
+|\'msgs'| |\'messages'|
+||'messages' 'msgs'|| number (default: 100)
+____
+Number of messages to store in the message history.
+____
+
+
+|\'nomore'| |\'more'|
+||'more'|| boolean (default: on)
+____
+Pause the message list window when more than one screen of listings is displayed
+____
+
+
+|\'nextpattern'|
+||'nextpattern'|| stringlist
+____
+(default: \bnext,^>$,^(>>|»)$,^(>|»),(>|»)$,\bmore\b)
+
+Patterns to use when guessing the \'next' page in a document sequence. Each
+pattern, in order, is matched against all links in the page with the first
+match being used. The patterns are case insensitive regular expressions and the
+link elements are those defined by 'hinttags'.
+____
+
+
+|\'newtab'|
+||'newtab'|| stringlist (default: "")
+____
+Define which Ex commands output the result in a new tab automatically. You can
+also use [c]:tab command[c] to manually output a command in a new tab.
+
+The possible values:
+`------------`---------------------------------------------
+*all* All commands
+*addons* [c]:addo[ns][c] command
+*downloads* [c]:downl[oads][c] command
+*help* [c]:h[elp][c] command
+*javascript* [c]:javascript![c] or [c]:js![c] command
+*prefs* [c]:pref[erences]![c] or [c]:prefs![c] command
+-----------------------------------------------------------
+
+____
+
+
+|\'noonline'| |\'online'|
+||'online'|| boolean (default on)
+____
+Show and set the \'work offline' behavior.
+____
+
+
+|\'pageinfo' \'pa'|
+||'pageinfo' 'pa'||
+charlist (default: gfm)
+____
+Desired info on [c]:pa[geinfo][c]. Available items:
+
+.--------`----------------
+*g* General info
+*f* Feeds
+*m* Meta tags
+--------------------------
+
+The order matters.
+____
+
+
+|\'pps'| |\'popups'|
+||'popups' 'pps'|| number (default: 1)
+____
+Define where to show requested popup windows.
+Does not apply to windows which are opened by middle clicking a link,
+they always open in a new tab. Possible values:
+
+.---`------------------------------------------------------------------------------------------------
+*0* Force to open in the current tab (Warning: this can stop some web sites from working correctly!)
+*1* Always open in a new tab
+*2* Open in a new window if it has a specific requested size (default in Firefox)
+*3* Always open in a new window
+*4* Open in the same tab unless it has a specific requested size
+-----------------------------------------------------------------------------------------------------
+
+Note: This option does not change the popup blocker of Firefox in any way.
+____
+
+
+|\'nopreload'| |\'preload'|
+||'preload' 'nopreload'|| boolean (default: on)
+____
+Speed up first time history/bookmark completion
+
+History access can be quite slow for a large history.
+Vimperator maintains a cache to speed it up significantly on subsequent access.
+In order to also speed up first time access, it is cached at startup, if this option is set (recommended).
+____
+
+
+|\'previouspattern'|
+||'previouspattern'|| stringlist
+____
+(default: \bprev|previous\b,^<$,^(<<|«)$,^(<|«),(<|«)$)
+
+Patterns to use when guessing the \'previous' page in a document sequence. Each
+pattern, in order, is matched against all links in the page with the first
+match being used. The patterns are case insensitive regular expressions and the
+link elements are those defined by 'hinttags'.
+____
+
+
+|$VIMPERATOR_RUNTIME|
+|\'rtp'| |\'runtimepath'|
+||'runtimepath' 'rtp'|| stringlist
+____
+(default: _$VIMPERATOR_RUNTIME_ or Unix, Mac: "\~/.vimperator", Windows: "\~/vimperator")
+
+List of directories searched for runtime files: +
+colors/ +
+macros/ +
+plugin/ +
+
+Example: [c]:set runtimepath=\~/myvimperator,\~/.vimperator[c] +
+This will search for plugins in both "\~/myvimperator/plugin" and
+"\~/.vimperator/plugin"
+
+On startup, if the environment variable _$VIMPERATOR_RUNTIME_ does not
+exist, Vimperator will set it to match this value.
+____
+
+
+|\'scr'| |\'scroll'|
+||'scroll' 'scr'|| number (default: 0)
+____
+Number of lines to scroll with [m]<C-u>[m] and [m]<C-d>[m] commands.
+The number of lines scrolled defaults to half the window size.
+When a [count] is specified to the [m]<C-u>[m] or [m]<C-d>[m] commands this is
+used to set the value of 'scroll' and also used for the current command. The
+value can be reset to half the window height with [c]:set scroll=0[c].
+____
+
+
+|\'shell'| |\'sh'|
+||'shell' 'sh'|| string (default: _$SHELL_ or "sh", Win32: "cmd.exe")
+____
+Shell to use for executing [c]:![c] and [c]:run[c] commands.
+____
+
+
+|\'shellcmdflag'| |\'shcf'|
+||'shellcmdflag' 'shcf'|| string (default: "-c", Win32: "/c")
+____
+Flag passed to shell when executing [c]:![c] and [c]:run[c] commands.
+
+E.g. "bash -c gvim"
+____
+
+
+|\'nosmd'| |\'noshowmode'| |\'smd'| |\'showmode'|
+||'showmode' 'smd'|| boolean (default: on)
+____
+Show the current mode in the command line.
+____
+
+
+|\'ssli'| |\'showstatuslinks'|
+||'showstatuslinks' 'ssli'|| number (default: 1)
+____
+Show the destination of the link under the cursor in the status bar.
+Also links which are focused by keyboard commands like [m]<Tab>[m] are shown. Possible values:
+
+.---`--------------------------------------
+*0* Don't show link destination
+*1* Show the link in the status line
+*2* Show the link in the command line
+-------------------------------------------
+
+____
+
+
+|\'stal'| |\'showtabline'|
+||'showtabline' 'stal'|| number (default: 2)
+____
+Control when to show the tab bar of opened web pages. Possible values:
+
+.---`--------------------------------------
+*0* Never show tab bar
+*1* Show tab bar only if more than one tab is open
+*2* Always show tab bar
+-------------------------------------------
+
+____
+
+
+|\'noscs'| |\'nosmartcase'| |\'scs'| |\'smartcase'|
+||'smartcase' 'scs'|| boolean (default: on)
+____
+Override the 'ignorecase' option if the pattern contains uppercase characters.
+This is only used if the 'ignorecase' option is set.
+____
+
+
+|\'suggestengines'|
+||'suggestengines' || stringlist (default: "google")
+____
+Set the search engines which can be used for completion suggestions.
+Add "S" to the 'complete' option if you want to use this feature.
+
+Warning: This feature could make tab-completion slower because it needs to
+wait for changes, so use it only if you have a fast internet connection.
+____
+
+
+|\'titlestring'|
+||'titlestring'|| string (default: "Vimperator")
+____
+Change the title of the browser window.
+Vimperator changes the browser title from "Title of web page - Mozilla Firefox" to
+"Title of web page - Vimperator". +
+If you don't like that, you can restore it with:
+[c]:set titlestring=Mozilla\ Firefox[c].
+____
+
+
+|\'noum'| |\'nousermode'| |\'um'| |\'usermode'|
+||'usermode' 'um'|| boolean (default: off)
+____
+Show current website with a minimal style sheet to make it easily accessible.
+
+Note: this is a local option for now, a global value may be supported in the
+future.
+____
+
+
+|\'urlseparator'|
+||'urlseparator'|| string (default: ",\s")
+____
+Set the separator regexp used to separate multiple URL args. Multiple arguments
+can be specified for [c]:open[c], and similar commands, using this regexp as
+the separator. Using whitespace alone is not generally useful since it is often
+contained in a single argument. E.g. [c]:open linus torvalds[c] should perform
+a single search for the key words "linus" and "torvalds"
+____
+
+
+|\'verbose', \'vbs'|
+||'verbose' 'vbs'|| number (default: 1)
+____
+Define which info messages are displayed.
+When bigger than zero, Vimperator will give messages about what it is doing.
+These can be viewed at any time with the [c]:messages[c] command. The highest
+value is 15, being the most verbose mode.
+
+TODO: list levels and associated messages
+____
+
+
+|\'novb'| |\'novisualbell'| |\'vb'| |\'visualbell'|
+||'visualbell' 'vb'|| boolean (default: off)
+____
+Use visual bell instead of beeping on errors. The visual bell style is
+controlled by [c]:hi Bell[c].
+____
+
+
+|\'wildcase'| |\'wic'|
+||'wildcase' 'wic'|| string (default: "smart")
+____
+Defines how completions are matched with regard to character case.
+
+`---------------`------------------------
+"smart" Case is significant when capital letters are typed
+"match" Case is always significant
+"ignore" Case is never significant
+-----------------------------------------
+
+____
+
+
+|\'wildignore'| |\'wig'|
+||'wildignore' 'wig'|| stringlist (default: "")
+____
+List of file patterns to ignore when completing files. E.g. to ignore object
+files and Vim swap files [c]:set wildignore=".*\.o,\..*\.s[a-z]\\{2}"[c]
+
+Note: Unlike Vim each pattern is a regexp rather than a glob.
+____
+
+
+|\'wim'| |\'wildmode'|
+||'wildmode' 'wim'|| stringlist (default: "list:full")
+____
+Defines how command-line completion works.
+It is a comma-separated list of parts, where each part specifies
+what to do for each consecutive use of the completion key.
+The first part specifies the behavior for the first use of the completion key,
+the second part for the second use, etc.
+
+These are the possible values for each part:
+`---------------`------------------------
+"" Complete only the first match.
+"full" Complete the next full match. After the last, the original string is used.
+"longest" Complete till the longest common string.
+"list" When more than one match, list all matches.
+"list:full" When more than one match, list all matches and complete the first match.
+"list:longest" When more than one match, list all matches and complete till the longest common string. \
+ When there is only a single match, it is fully completed regardless of the case.
+-----------------------------------------
+
+____
+
+
+|\'wop'| |\'wildoptions'|
+||'wildoptions' 'wop'|| stringlist (default: "")
+____
+A list of words that change how command-line completion is done.
+
+Possible words:
+`--------`-------------------------------
+*auto* Automatically show completions while you are typing.
+*sort* Always sort the completion list, overriding the 'complete' option.
+-----------------------------------------
+
+____
+
+
+|\'wsp'| |\'wordseparators'| +
+||'wordseparators' 'wsp'|| string
+____
+(default: [\.,!\?:;/\\"\^\$%&?\(\)\[\]\\{\\}<>#\\*\+\\|=~ _\\-])
+
+A regexp which defines the word separators which are used for the
+'hintmatching' types "wordstartswith" and "firstletters" to split the words in
+the text of a link.
+____
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/overlay.dtd b/xulmus/locale/en-US/overlay.dtd
new file mode 100755
index 00000000..9005d9c4
--- /dev/null
+++ b/xulmus/locale/en-US/overlay.dtd
@@ -0,0 +1,4 @@
+<!ENTITY auditortest1.helloworld.label "Do HelloWorld">
+<!ENTITY auditortest1.helloworld.accesskey "H">
+<!ENTITY auditortest1.pane.label "This is a Display Pane">
+<!ENTITY auditortest1.pane.button "Learn More"> \ No newline at end of file
diff --git a/xulmus/locale/en-US/overlay.properties b/xulmus/locale/en-US/overlay.properties
new file mode 100755
index 00000000..82aef91d
--- /dev/null
+++ b/xulmus/locale/en-US/overlay.properties
@@ -0,0 +1 @@
+helloMessage=Hello World!
diff --git a/xulmus/locale/en-US/pattern.txt b/xulmus/locale/en-US/pattern.txt
new file mode 100755
index 00000000..6462a897
--- /dev/null
+++ b/xulmus/locale/en-US/pattern.txt
@@ -0,0 +1,70 @@
+HEADER
+
+|text-search-commands| +
+
+Vimperator provides a Vim-like interface to Firefox's standard text search
+functionality. There is no support for using regular expressions in search
+commands as Firefox does not provide native regexp support. It is unlikely that
+this will ever be available.
+
+|/| +
+||/{pattern}[/]<CR>|| +
+________________________________________________________________________________
+Search forward for the first occurrence of {pattern}.
+
+If "\c" appears anywhere in the pattern the whole pattern is handled as though
+'ignorecase' is on. "\C" forces case-sensitive matching for the whole pattern. +
+If "\l" appears in the pattern only the text of links is searched for a
+match as though 'linksearch' is on. "\L" forces the entire page to be searched
+for a match.
+________________________________________________________________________________
+
+
+|?| +
+||?{pattern}[?]<CR>|| +
+________________________________________________________________________________
+Search backwards for {pattern}.
+
+{pattern} can use the same modifiers as for [m]/[m]. +
+
+Note: incremental searching currently only works in the forward direction.
+________________________________________________________________________________
+
+
+|n| +
+||n||
+________________________________________________________________________________
+Find next. Repeat the last search 1 time (until count is supported).
+________________________________________________________________________________
+
+
+|N| +
+||N||
+________________________________________________________________________________
+Find previous. Repeat the last search 1 time (until count is supported) in the
+opposite direction.
+________________________________________________________________________________
+
+
+|\*| +
+||\*||
+________________________________________________________________________________
+Search forward for the next word under the cursor.
+________________________________________________________________________________
+
+
+|\#| +
+||\#||
+________________________________________________________________________________
+Search backward for the previous word under the cursor.
+________________________________________________________________________________
+
+
+|:noh| |:nohlsearch| +
+||:noh[lsearch]||
+________________________________________________________________________________
+Remove the search highlighting. The document highlighting is turned back on
+when another search command is used or the 'hlsearch' option is set.
+________________________________________________________________________________
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/print.txt b/xulmus/locale/en-US/print.txt
new file mode 100755
index 00000000..8cf3d180
--- /dev/null
+++ b/xulmus/locale/en-US/print.txt
@@ -0,0 +1,34 @@
+HEADER
+
+|printing| +
+
+|:ha| |:hardcopy| +
+||:ha[rdcopy][!]||
+________________________________________________________________________________
+Print current document. Open a GUI dialog where you can select the printer,
+number of copies, orientation, etc. When used with [!], the dialog is skipped
+and the default printer used.
+________________________________________________________________________________
+
+
+||:ha[rdcopy][!] >{filename}|| +
+________________________________________________________________________________
+As above, but write the output to {filename}.
+
+Note: Not available on Windows.
+________________________________________________________________________________
+
+section:Firefox{nbsp}printing{nbsp}dialogs[firefox-print-dialogs]
+
+The "Print Preview" and "Page Setup" dialogs can be opened via the [c]:dialog[c]
+command
+
+\{nbsp}[c]:dialog printpreview[c]
+
+and
+
+\{nbsp}[c]:dialog printsetup[c]
+
+respectively.
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/repeat.txt b/xulmus/locale/en-US/repeat.txt
new file mode 100755
index 00000000..2817c980
--- /dev/null
+++ b/xulmus/locale/en-US/repeat.txt
@@ -0,0 +1,145 @@
+HEADER
+
+|repeat| +
+
+Vimperator can repeat a number of commands and record macros.
+
+section:Macros[macros,complex-repeat]
+
+|q|
+||q{0-9a-zA-Z}|| +
+____________________________________________________________________________
+Record a key sequence into a macro.
+Available macros are {0-9a-zA-Z} (uppercase to append).
+Type [m]q[m] to stop recording.
+____________________________________________________________________________
+
+
+|:macros|
+||:mac[ros] [a][pat][a]|| +
+________________________________________________________________________________
+List recorded macros matching the optional regular expression [a][pat][a]. If
+no regexp is given, list all macros.
+________________________________________________________________________________
+
+
+|:delmac| |:delmacros|
+||:delmac[ros] {args}|| +
+||:delmac[ros]!||
+________________________________________________________________________________
+Delete recorded macros matching the regular expression {args}. If [!] is given
+all macros are deleted.
+________________________________________________________________________________
+
+
+|@| |:play|
+||:pl[ay] {arg}|| +
+||[count]@{arg}||
+____________________________________________________________________________
+Plays the contents of macro with name {arg} [count] times. The [m]@[m] mapping
+only accepts {0-9a-z} as {arg}.
+____________________________________________________________________________
+
+
+|@@|
+||[count]@@||
+____________________________________________________________________________
+Replay the last executed macro [count] times.
+____________________________________________________________________________
+
+
+|.|
+||[count].||
+____________________________________________________________________________
+Repeat the last keyboard mapping [count] times. Note that, unlike in Vim, this
+does not apply solely to editing commands, mainly because Vimperator doesn't
+have them.
+____________________________________________________________________________
+
+
+section:Using{nbsp}scripts[using-scripts]
+
+|:so| |:source|
+||:so[urce][!] {file}|| +
+________________________________________________________________________________
+Read Ex commands, JavaScript, or CSS from {file}. You can either source files
+which mostly contain Ex commands like [c]map < gt[c] and put JavaScript code
+within a:
+
+--------------------------------------------------------------------------------
+js <<EOF
+hello = function () {
+ alert("Hello world");
+}
+EOF
+--------------------------------------------------------------------------------
+Or you can alternatively source a file which ends in _.js_. These files are
+automatically sourced as pure JavaScript files.
+
+Note: In both cases you must add functions to the global window object like
+shown above, functions written as:
+--------------------------------------------------------------------------------
+function hello2() {
+ alert("Hello world");
+}
+--------------------------------------------------------------------------------
+are only available within the scope of the script.
+
+The _.vimperatorrc_ file in your home directory and any files in
+_\~/.vimperator/plugin/_ are always sourced at startup. \~ is supported as a
+shortcut for the _$HOME_ directory. If [!] is specified, errors are not
+printed.
+________________________________________________________________________________
+
+
+|:lpl| |:loadplugins|
+||:loadplugins|| +
+________________________________________________________________________________
+Load all unloaded plugins immediately. Because plugins are automatically
+loaded after vimperatorrc is sourced, this command must be placed early
+in the vimperatorrc file if vimperatorrc also includes commands that are
+implemented by plugins. Additionally, this command allows for sourcing
+new plugins without restarting Vimperator.
+________________________________________________________________________________
+
+
+|:ru| |:runtime|
+||:runt[ime][!] {file} ...|| +
+________________________________________________________________________________
+Source the specified file from each directory in 'runtimepath'. Example: +
+[c]:runtime plugin/foobar.vimp[c] +
+Only the first found file is sourced. When [!] is given, all found files are
+sourced.
+________________________________________________________________________________
+
+
+|:scrip| |:scriptnames|
+||:scrip[tnames]|| +
+________________________________________________________________________________
+List all sourced script names, in the order they were first sourced.
+________________________________________________________________________________
+
+
+|:fini| |:finish|
+||:fini[sh]|| +
+________________________________________________________________________________
+Stop sourcing a script file. This can only be called from within a Vimperator
+script file.
+________________________________________________________________________________
+
+section:Profiling[profile,profiling]
+
+|:time|
+||:[count]time[!] {code|:command}|| +
+________________________________________________________________________________
+Profile a piece of code or a command. Run {code} [count] times (default 1)
+and returns the elapsed time. {code} is always passed to JavaScript's eval(),
+which might be slow, so take the results with a grain of salt.
+
+If {code} starts with a [c]:[c], it is executed as a Vimperator command.
+
+Use the special version with [!] if you just want to run any command multiple
+times without showing profiling statistics.
+________________________________________________________________________________
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/starting.txt b/xulmus/locale/en-US/starting.txt
new file mode 100755
index 00000000..df384fd0
--- /dev/null
+++ b/xulmus/locale/en-US/starting.txt
@@ -0,0 +1,60 @@
+HEADER
+
+Vimperator does not yet read any command-line options. When it does, they will
+be documented here.
+
+section:Initialization[initialization,startup]
+
+At startup, Vimperator completes the following tasks in order.
+
+1. Vimperator can perform user initialization commands. When
+one of the following is successfully located, it is executed, and no
+further locations are tried.
+
+ a. |$VIMPERATOR_INIT|
+ _$VIMPERATOR_INIT_ -- May contain a single Ex command (e.g.,
+ "[c]:source {file}[c]").
+ b. [a]\~/_vimperatorrc[a] -- Windows only. If this file exists, its contents
+ are executed.
+ c. [a]\~/.vimperatorrc[a] -- If this file exists, its contents are executed.
+
+2. If 'exrc' is set, then any RC file in the current directory is also sourced.
+
+3. All directories in 'runtimepath' are searched for a "plugin"
+subdirectory and all yet unloaded plugins are loaded. For each plugin
+directory, all *.\{js,vimp} files (including those in further
+subdirectories) are sourced alphabetically. No plugins will be sourced
+if 'noloadplugins' is set. Any particular plugin will not be loaded if
+it has already been loaded (e.g., by an earlier [c]:loadplugins[c]
+command).
+
+The user's ~ (i.e., "home") directory is determined as follows:
+
+* On Unix and Mac, the environment variable _$HOME_ is used.
+* On Windows, Vimperator checks for the existence of _%HOME%_, then
+_%USERPROFILE%_, and then _%HOMEDRIVE%%HOMEPATH%_. It uses the first one
+it finds.
+
+section:Saving{nbsp}settings[save-settings]
+
+|:mkv| |:mkvimperatorrc|
+||:mkv[imperatorrc][!] [a][file][a]|| +
+________________________________________________________________________________
+Write current key mappings and changed options to [a][file][a]. If no
+[a][file][a] is specified then _~/.vimperatorrc_ is written unless this file
+already exists. The special version [c]:mkvimperatorrc![c] will overwrite
+[a][file][a] if it exists.
+
+Warning: this differs from Vim's behavior which defaults to writing the file
+in the current directory.
+________________________________________________________________________________
+
+section:Restarting[restarting]
+
+|:res| |:restart| +
+||:res[tart]||
+________________________________________________________________________________
+Force the browser to restart. Useful when installing extensions.
+________________________________________________________________________________
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/styling.txt b/xulmus/locale/en-US/styling.txt
new file mode 100755
index 00000000..a4ba91a2
--- /dev/null
+++ b/xulmus/locale/en-US/styling.txt
@@ -0,0 +1,131 @@
+HEADER
+
+|styling| +
+
+Vimperator allows you to style both the browser and any web pages you view. All
+styling is specified via CSS. Although you may style any user interface element
+via the [c]:style[c] command, most Vimperator elements can be styled with the
+[c]:highlight[c] command, for convenience.
+
+|E185| |:colo| |:colorscheme| +
+||:colo[rscheme] {name}|| +
+________________________________________________________________________________
+Load a color scheme. {name} is found by searching the 'runtimepath' for the
+first file matching colors/{name}.vimp.
+
+The ColorScheme autocommand is triggered after the color scheme has been
+sourced.
+________________________________________________________________________________
+
+|:hi| |:highlight| +
+||:hi[ghlight][!] [-append] {group}[{selector}] [{css}]|| +
+________________________________________________________________________________
+Highlight {group} with {css}. Normally, {css} is checked for
+valid syntax before it's applied. Once you're certain it's
+valid, [!] will override the check, to speed Vimperator startup.
+{selector} can be any valid CSS selector, such as [c]:hover[c], and
+if provided will restrict the match to matching elements.
+
+Valid groups are:
+`--------------------`-----------------------------------
+*Bell* Vimperator's visual bell
+*Boolean* A JavaScript Boolean object
+*CmdLine* The command line
+*CmdOutput*
+*CompDesc* The description column of the completion list
+*CompGroup*
+*CompIcon* The favicon of a completion row
+*CompItem* A row of completion list
+*CompItem[selected]* A selected row of completion list
+*CompLess* The indicator shown when completions may be scrolled up
+*CompLess::after* The character of indicator shown when completions may be scrolled up
+*CompMore* The indicator shown when completions may be scrolled down
+*CompMore::after* The character of indicator shown when completions may be scrolled down
+*CompMsg*
+*CompResult* The result column of the completion list
+*CompTitle* Completion row titles
+*ErrorMsg* Error messages
+*Filter* The matching text in a completion list
+*FrameIndicator* The indicator shown when a new frame is selected
+*Function* A JavaScript Function object
+*Gradient*
+*GradientLeft*
+*GradientRight*
+*Hint* A hint indicator. See [c]:help hints[c]
+*HintActive* The hint element of link which will be followed by <Enter>
+*HintElem* The hintable element
+*HintImage* The indicator which floats above hinted images
+*Indicator*
+*InfoMsg* Information messages
+*Keyword* A bookmark keyword for a URL
+*LineNr* The line number of an error
+*Message*
+*ModeMsg* The mode indicator in the command line
+*MoreMsg* The indicator that there is more text to view
+*NonText*
+*Normal* Normal text in the command line
+*Null* A JavaScript Null object
+*Number* A JavaScript Number object
+*Object* A JavaScript Object
+*Preview*
+*Question* A prompt for a decision
+*Search* Highlighted search results in a web page
+*StatusLine* The status bar
+*StatusLineBroken* The status bar for a broken web page
+*StatusLineSecure* The status bar for a secure web page
+*String* A JavaScript String object
+*TabClose* The close button of a browser tab
+*TabIcon* The icon of a browser tab
+*TabIconNumber* The number of a browser tab, over its icon
+*TabNumber* The number of a browser tab, next to its icon
+*TabText* The text of a browser tab
+*Tag* A bookmark tag for a URL
+*Title* The title of a listing, including [c]:pageinfo[c], [c]:jumps[c]
+*URL* A URL
+*WarningMsg* A warning message
+-------------------------------------------------------
+
+Every invocation completely replaces the styling of any previous invocation,
+unless *-append* (short option: *-a*) is provided, in which case {css} is
+appended to its current value. If {css} is not provided, any styles matching
+{group} are listed.
+________________________________________________________________________________
+
+|:highlight-clear| +
+||:hi[light] clear [{group}[{selector}]]|| +
+________________________________________________________________________________
+Reset the highlighting for {group} to its default value. If
+{group} is not given, reset all highlighting groups.
+________________________________________________________________________________
+
+
+|:sty| |:style| +
+||:sty[le][!] [-name={name}] [-append] {filter} [{css}]|| +
+________________________________________________________________________________
+Add CSS styles to the browser or to web pages. {filter} is a comma
+separated list of URLs to match. URLs ending with *\** are matched as
+prefixes, URLs not containing any *:* or */* characters are
+matched as domains. If {name} (short option: [c]-n[c]) is provided, any
+existing style with the same name is overridden, and the style may later
+be deleted using {name}. If *-append* (short option: *-a*) is provided
+along with *-name*, {css} and {filter} are appended to its current
+value.
+
+If {css} isn't provided, matching styles are listed.
+________________________________________________________________________________
+
+|:dels| |:delstyle| +
+||:dels[tyle] [-name={name}] [-index={index}] [{filter}] [{css}]|| +
+________________________________________________________________________________
+Delete any matching styles. If {filter} is provided, only matching elements of
+the filter are disabled. For instance, a filter [c]mozilla.org[c], given a
+style for [c]www.google.com,mozilla.org[c], will result in a style for
+[c]www.google.com[c]. The available options are:
+
+ * [c]-name[c]: The name provided to [c]:style[c] (short option:
+ *-n*)
+ * [c]-index[c]: For unnamed styles, the index listed by [c]:style[c]
+ (short option: *-i*)
+________________________________________________________________________________
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/tabs.txt b/xulmus/locale/en-US/tabs.txt
new file mode 100755
index 00000000..9ccded72
--- /dev/null
+++ b/xulmus/locale/en-US/tabs.txt
@@ -0,0 +1,218 @@
+HEADER
+
+|tabs| +
+
+Tabs are used to be able to view many web pages at the same time. Each tab
+contains exactly one buffer -- multiple buffers per tab are not supported. As a
+result many buffer and tab commands are interchangeable.
+
+section:Listing{nbsp}tabs[listing-tabs]
+
+|B| |:tabs| |:ls| |:files| |:buffers|
+||:buffers [a][filter][a]|| +
+||B||
+________________________________________________________________________________
+Show a list of buffers (=tabs) matching [a][filter][a]. Without [a][filter][a]
+list all tabs.
+________________________________________________________________________________
+
+section:Opening{nbsp}tabs[opening-tabs]
+
+|:tab| +
+||:tab {cmd}||
+________________________________________________________________________________
+Execute {cmd} and tell it to output in a new tab. Works only for commands that
+support it, currently:
+
+* [c]:tab help[c]
+* [c]:tab prefs[!][c]
+* [c]:tab addons[c]
+* [c]:tab downloads[c]
+________________________________________________________________________________
+
+
+|:tabd| |:tabduplicate|
+||:[count]tab[duplicate]|| +
+________________________________________________________________________________
+Duplicate the current tab and switch to the duplicate. If [count] is given,
+duplicate the tab [count] times.
+________________________________________________________________________________
+
+//TODO: should the tab commands be moved back here?
+See help::open[browsing.html#opening] for other ways to open new tabs.
+
+section:Changing{nbsp}tabs[changing-tabs]
+
+|gb| +
+||[count]gb||
+________________________________________________________________________________
+Repeat last [c]:buffer[!][c] command. This is useful to quickly jump between
+buffers which have a similar URL or title.
+________________________________________________________________________________
+
+
+|gB| +
+||[count]gB||
+________________________________________________________________________________
+Repeat last [c]:buffer[!][c] command in reverse direction. Just like [m]gb[m]
+but in the other direction.
+________________________________________________________________________________
+
+
+|gt| +
+||[count]gt||
+________________________________________________________________________________
+Go to the next tab. Cycles to the first tab, when the last is selected. +
+If [count] is specified go to the [count]th tab.
+________________________________________________________________________________
+
+|<C-PageDown>| |<C-Tab>| |<C-n>| +
+||[count]<C-n>||
+________________________________________________________________________________
+Go to the next tab. Cycles to the first tab, when the last is selected. +
+If [count] is specified go to the [count]th next tab.
+________________________________________________________________________________
+
+|<C-PageUp>| |<C-S-Tab>| |<C-p>| |gT| +
+||[count]gT||
+________________________________________________________________________________
+Go {count} pages back. Wraps around from the first tab to the last tab. +
+If [count] is specified go back [count] tabs.
+________________________________________________________________________________
+
+
+|<C-6>| |<C-^>| +
+||[count]<C-^>||
+________________________________________________________________________________
+Select the alternate tab or the [count]th tab. The alternate tab is the last
+selected tab. This provides a quick method of toggling between two tabs.
+________________________________________________________________________________
+
+
+|b| |:b| |:buffer|
+||:[count]b[uffer][!] [a][url|index][a]|| +
+||[count]b||
+________________________________________________________________________________
+Go to the specified buffer from the buffer list. Argument can be either the
+buffer index or the full URL. If [count] is given, go to the [count]th buffer.
+
+If argument is neither a full URL nor an index but uniquely identifies a
+buffer, it is selected. With [!] the next buffer matching the argument is
+selected, even if it cannot be identified uniquely. Use [m]b[m] as a
+shortcut to open this prompt.
+
+If argument is [a]\#[a], the alternate buffer will be selected (see [m]<C-^>[m]).
+
+If no argument is given the current buffer remains current.
+________________________________________________________________________________
+
+
+|g^| |g0| |:bf| |:bfirst| |:br| |:brewind| |:tabfir| |:tabfirst| |:tabr| |:tabrewind|
+||:tabr[ewind]|| +
+||:tabfir[st]|| +
+||:br[ewind]|| +
+||:bf[irst]|| +
+||g0|| +
+||g^||
+________________________________________________________________________________
+Switch to the first tab.
+________________________________________________________________________________
+
+
+|g$| |:bl| |:blast| |:tabl| |:tablast|
+||:tabl[ast]|| +
+||:bl[ast]|| +
+||g$||
+________________________________________________________________________________
+Switch to the last tab.
+________________________________________________________________________________
+
+
+|:tabde| |:tabdetach| +
+||:tabde[tach]||
+________________________________________________________________________________
+Detach the current tab, and open it in its own window.
+________________________________________________________________________________
+
+
+|:tabm| |:tabmove|
+||:tabm[ove] [a][N][a]|| +
+||:tabm[ove][!] [a]+N[a] | [a]-N[a]|| +
+________________________________________________________________________________
+Move the current tab to a position after tab [a]N[a]. When [a]N[a] is 0, the
+current tab is made the first one. Without [a]N[a] the current tab is made the
+last one. [a]N[a] can also be prefixed with "+" or "-" to indicate a relative
+movement. If [!] is specified the movement wraps around the start or end of the
+tab list.
+________________________________________________________________________________
+
+
+|:bn| |:bnext| |:tn| |:tnext| |:tabn| |:tabnext|
+||:[count]tabn[ext] [count]|| +
+||:[count]tn[ext] [count]|| +
+||:[count]bn[ext] [count]|| +
+________________________________________________________________________________
+Switch to the next or [count]th tab. Cycles to the first tab when the last is
+selected and [count] is not specified.
+________________________________________________________________________________
+
+
+|:tabo| |:tabonly|
+||:tabo[nly]||
+________________________________________________________________________________
+Close all other tabs.
+________________________________________________________________________________
+
+
+|:bN| |:bNext| |:bp| |:bprevious| |:tN| |:tNext| |:tabN| |:tabNext| |:tp| |:tprevious| |:tabp| |:tabprevious| +
+||:[count]tabp[revious] [count]|| +
+||:[count]tp[revious] [count]|| +
+||:[count]tabN[ext] [count]|| +
+||:[count]bp[revious] [count]|| +
+||:[count]bN[ext] [count]|| +
+________________________________________________________________________________
+Switch to the previous tab or go [count] tabs back. Wraps around from the
+first tab to the last tab.
+________________________________________________________________________________
+
+
+
+section:Closing{nbsp}tabs[closing-tabs]
+
+|d| |:tabc| |:tabclose| |:bun| |:bunload| |:bw| |:bwipeout| |:bd| |:bdelete|
+||:[count]bd[elete][!] [a][arg][a]|| +
+||[count]d||
+________________________________________________________________________________
+Delete current buffer (=tab). If [count] is specified then [count] tabs are
+removed. Afterwards, the tab to the right of the deleted tab(s) is selected.
+
+When used with [a][arg][a], remove all tabs which contain [a][arg][a] in the
+hostname. [!] forces this command to also search for [a][arg][a] in the full
+URL and also the title of the tab. Use with care.
+________________________________________________________________________________
+
+
+|D|
+||[count]D||
+________________________________________________________________________________
+Like [m]d[m] but selects the tab to the left of the deleted tab.
+________________________________________________________________________________
+
+
+|u| |:u| |:undo|
+||:[count]u[ndo] [a][url][a]|| +
+||[count]u||
+________________________________________________________________________________
+Undo closing of a tab. If a count is given, don't undo the last but the
+[count]th last closed tab. With [a][url][a] restores the tab matching the URL.
+________________________________________________________________________________
+
+
+|:undoa| |:undoall| +
+||:undoa[ll]||
+________________________________________________________________________________
+Undo closing of all closed tabs. Firefox stores up to 10 closed tabs, even
+after a browser restart.
+________________________________________________________________________________
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/tutorial.txt b/xulmus/locale/en-US/tutorial.txt
new file mode 100755
index 00000000..461a6aed
--- /dev/null
+++ b/xulmus/locale/en-US/tutorial.txt
@@ -0,0 +1,253 @@
+HEADER
+
+// Initial revision: Sun Jun 8 10:07:05 UTC 2008 (penryu)
+
++++<div style="text-align: center;">+++
+*This is a quickstart tutorial to help get new users up and running in
+Vimperator. It is not intended as a full reference explaining all features.*
++++</div>+++
+
+section:Quick-start{nbsp}tutorial[tutorial]
+
+If you've started using Vimperator from scratch (i.e., without any
+customization), you should be looking at this help page in a relatively
+bare-looking window. The menubar, navigation bar, and bookmark bars are hidden.
+In case you missed the notice in the help:Introduction[intro.html], you can
+regain these by issuing the command
+
+\{nbsp}[c]:set go+=mTB<CR>[c]
+
+where [m]<CR>[m] represents pressing the <Enter> or <Return> key.
+If you're a veteran Vim user, this may look familiar. It should.
+
+However, in this author's opinion, the best way to get familiar with
+Vimperator is to leave these disabled for now. (The above action can be
+reversed with [c]:set go=<CR>[c]) You can look at the entry for
+[o]guioptions[o] in help:options[options.html] for more information on this.
+
+section:Vimperator's{nbsp}modal{nbsp}interface[modal]
+
+Vimperator's power, like Vim's, comes from it's modal interface. Keys have
+different meanings depending on which mode the browser is in. Vimperator has
+several modes, but the 2 most important are ``Normal'' mode and
+``Command-line'' mode.
+
+When Vimperator starts, it is in Normal mode by default. This is probably where
+you will spend the majority of your time.
+
+The other core mode of Vimperator, Command-line mode, can be entered from
+Normal mode by typing a \':' (colon). You will frequently see Vimperator
+commands start with a \':', indicating that what follows is a command.
+
+To return to Normal mode from Command-line mode, type [m]<Esc>[m]. Pressing
+[m]<Esc>[m] will also return you to Normal mode from most other modes in
+Vimperator.
+
+section:Getting{nbsp}help[getting-help]
+
+Vim is a great editor but it's not much of a web browser. So even seasoned Vim
+users will probably have to look at Vimperator documentation sooner or later.
+Most of the documentation for Vimperator's features are easily found using the
+[c]:help[c] command. For example, you can find help on the [c]:help[c] command
+by typing
+
+\{nbsp}[c]:help :help<CR>[c]
+
+Similarly, help on configurable options is available with [c]:help
+'{option_name}'[c]. (Note the single quotes around the option name as in Vim.)
+Information on all available options is, predictably, [c]:help options[c].
+
+and you can find out about the [m]gt[m] and [m]gT[m] mapping with
+
+\{nbsp}[c]:help gt<CR>[c] +
+\{nbsp}[c]:help gT<CR>[c]
+
+Finally, in addition to the help system itself, [c]:exusage[c], [c]:viusage[c]
+and [c]:optionusage[c] are useful quick-reference commands.
+
+section:Mouseless[living-mouseless]
+
+*-- or how I learned to stop worrying and love the 80+ buttons I already have.*
+
+The efficiency of Vimperator, as with the legendary editor it was inspired by,
+relies on the user being able to keep his fingers on the keyboard where they
+can do the most good. While there are some areas where the mouse is clearly
+superior at, such as GUI design or some games, Vimperator acts on the
+assumption that a web browser doesn't have to be one of those.
+
+Here are some areas where the mouse is typically considered indisposable, and
+how Vimperator challenges this preconception.
+
+section:Scrolling[keyboard-scrolling]
+
+Scrolling the browser window is done with simple keystrokes:
+
+ * [m]j[m]/[m]k[m] --
+ scroll window down/up by one line, respectively
+ * [m]h[m]/[m]l[m] --
+ scroll window left/right
+ * [m]<Space>[m]/[m]<C-b>[m] --
+ scroll down/up by one page
+ * [m]<C-d>[m]/[m]<C-u>[m] --
+ scroll down/up by 1/2 page
+
+Your standard buttons ([m]<Up>[m]/[m]<Down>[m]/[m]<PgUp>[m]/[m]<PgDn>[m]) will
+also work as expected.
+
+section:History{nbsp}and{nbsp}tabs[history-navigation,tab-navigation]
+
+History navigation (e.g., ``Back'', ``Forward'') are done similarly to
+scrolling.
+
+ * [m]<C-o>[m]/[m]<C-i>[m] --
+ move Back/Forward in the current window/tab's history, respectively
+
+Move between tabs using these keystrokes which may also be familiar to tabbing
+Vimmers.
+
+ * [m]gt[m]/[m]<C-n>[m] --
+ go to the next tab
+ * [m]gT[m]/[m]<C-p>[m] --
+ go to the previous tab
+ * [m]g0[m]/[m]g$[m] --
+ go to the first/last tab
+ * [m]d[m] --
+ close the active tab (delete the buffer)
+
+To open a web page in a new tab, use the [c]:tabopen {url}[c]. To open a URL in
+the current tab, use [c]:open[c]. The Normal mode mappings [m]t[m] and [m]o[m],
+respectively, map to these commands, so the following pairs of sequences are
+equivalent:
+
+\{nbsp}[c]:open my.webmail.com<CR>[c] +
+\{nbsp}[m]omy.webmail.com<CR>[m]
+
+\{nbsp}[c]:tabopen vimperator.org<CR>[c] +
+\{nbsp}[m]tvimperator.org<CR>[m]
+
+section:Some{nbsp}hints{nbsp}about{nbsp}surfing...[hints-tutorial]
+
+So now you can navigate around in Vimperator. But wait... how do you *open* a
+page or tab linked in a web page? How do you ``click'' on all those links
+without your tailed friend?
+
+The answer is ``hints''. Activating hints displays a number next to every link
+Vimperator can find. To follow the link, simply type the number corresponding
+to the hint, a white number inside a red square by default.
+
+For text links, there's an additional shortcut; you can type some text
+contained in the link and Vimperator will search all the links it can find and
+only hint the matching links, further narrowing down the list. If the text you
+type uniquely identifies any given link, Vimperator will follow that link
+immediately without any further user input.
+
+Whichever way you choose to indicate your target link, once Vimperator has
+highlighted the link you want, simply hit <Enter> to open it.
+
+The most common hint mode is called help:QuickHint{nbsp}mode[various.html,f].
+To activate QuickHint mode, press either [m]f[m] or [m]F[m]. The lower-case
+[m]f[m] will open the resulting link in the current tab, while the upper-case
+[m]F[m] will open it in a new tab.
+
+To test it, try this link: http://vimperator.org/[Vimperator Homepage].
+Activate QuickHint mode with [m]f[m] or [m]F[m] to highlight all currently
+visible links. Then start typing the text of the link. The link should be
+uniquely identified soon, and Vimperator will open it. Once you're done,
+remember to use [m]<C-o>[m] (``History Back'') or [m]d[m] (``Delete Buffer'')
+to return here, depending on which key you used to activate QuickHint mode.
+
+section:Common{nbsp}issues[common-issues]
+
+Say you get half-way done typing in a new URL, only to remember that you've
+already got that page open in the previous tab. Your command line might look
+something like this:
+
+\{nbsp}[c]:open my.partial.url/fooba[c]
+
+You can exit the command line and access the already loaded page with the
+following:
+
+\{nbsp}[m]<Esc>gT[m]
+
+section:Saving{nbsp}for{nbsp}posterity{nbsp}-{nbsp}vimperatorrc[vimperatorrc]
+
+Once you get Vimperator set up with your desired options, maps, and commands,
+you'll probably want them to be available the next time you open Vimperator.
+Continuing the Vim theme, this is done with a vimperatorrc file.
+
+To save your current settings and allow them to be loaded automatically
+next time you start Vimperator, issue the [c]:mkv[c] command.
+
+This will create the file *_$HOME_/.vimperatorrc* containing your settings.
+It is a simple text file, just like a vimrc file and can be easily
+edited to suit your preferences.
+
+section:Find{nbsp}the{nbsp}exit{nbsp}nearest{nbsp}you[quitting-without-menus]
+
+Vimperator supports all of Vim's classic methods of exiting.
+
+ * [c]:xall[c] -- command to quit and save the current browsing
+ session for next time; the default.
+ * [c]:qall[c] -- command to quit _without_ saving the session
+ * [m]ZZ[m] -- Normal mode mapping equivalent to [c]:xall[c]
+ * [m]ZQ[m] -- Normal mode mapping equivalent to [c]:qall[c]
+
+section:Where{nbsp}did{nbsp}Firefox{nbsp}go?[whither-firefox]
+
+You might feel pretty disoriented now. Don't worry. This is still Firefox
+underneath. Here are some ways Vimperator allows Firefox to shine through. See
+the [c]:help[c] for these commands and mappings for more information on how to
+make the best use of them.
+
+ * [c]:dialog[c] --
+ To access some of Firefox's many dialog windows, you can use the
+ [c]:dialog[c] command. See [c]:help :dialog[c].
+ * [c]:bmarks[c] --
+ Vimperator provides a new interface to bookmarks, but they're still your
+ standard Firefox bookmarks under the hood. [c]:bmark[c] will add a new
+ bookmark, while [c]:bmarks[c] will list the bookmarks currently defined.
+ * [c]:history[c] --
+ It's exactly what it sounds like. This command will display a colorized,
+ scrollable and clickable list of the locations in Vimperator's history.
+ * [c]:emenu[c] --
+ Access the Firefox menus through the Vimperator command line.
+
+
+Feel free to explore at this point. If you use the [c]:tabopen[c] command,
+remember to use the [m]gt[m]/[m]gT[m] mappings to get back to this page. If
+using the [c]:open[c] command, use the history keys (e.g., [m]H[m]) to return.
+If you get hopelessly lost, just type [c]:help<CR>[c] and click the
+``Tutorial'' link to return.
+
+
+// TODO: other sections?
+
+
+section:Get{nbsp}me{nbsp}out{nbsp}of{nbsp}here![removal]
+
+If you've given it a fair shot and determined ... TODO
+
+The Vimperator way to do this is with the command [c]:addons[c]. Issuing this
+command brings up the Firefox Add-ons dialog window; you can then remove it as
+normal, selecting Vimperator from the list and clicking (yes, clicking)
+*Uninstall*.
+
+Alternatively, you can do this the old-fashioned way: re-enable the menubar,
+as above, with [c]:set go+=m[c], and select *Add-ons* from the *Tools* menu.
+
+
+section:I'm{nbsp}interested...but{nbsp}lost![support]
+
+Vimperator has an energetic and growing user base. If you've run into a problem
+that you can't seem to solve with Vimperator, or if you think you might have
+found a bug, please let us know! There is support available on the
+http://vimperator.cutup.org/index.php?title=Main_Page[wiki], or in the
+#vimperator IRC channel on http://freenode.net/[freenode].
+
+If you have any feature requests or (even better) offers to help, we'd love to
+hear from you as well. Developers work on Vimperator whenever possible, but we
+are neither infinite nor omnipotent; please bear with us. If you can't wait for
+us to get around to it, rest assured patches are welcome! See the
+help:Developer[developer.html] page for more information.
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/various.txt b/xulmus/locale/en-US/various.txt
new file mode 100755
index 00000000..79d485dc
--- /dev/null
+++ b/xulmus/locale/en-US/various.txt
@@ -0,0 +1,111 @@
+HEADER
+
+section:Various{nbsp}commands[various]
+
+|:beep| +
+||:beep||
+________________________________________________________________________________
+Play a system beep.
+________________________________________________________________________________
+
+
+|<C-l>| |CTRL-L| |:redr| |:redraw| +
+||:redr[aw]||
+____
+Redraws the screen. Useful to update the screen halfway executing a script or function.
+____
+
+|:norm| |:normal|
+||:norm[al][!] {commands}|| +
+________________________________________________________________________________
+Execute Normal mode commands {commands}. This makes it possible to execute
+Normal mode commands typed on the command line. {commands} is executed like it
+is typed. If the [!] is given, mappings will not be used. {commands} should be
+a complete command. {commands} cannot start with a space. Put 1 space before
+it, 1 space is one space.
+________________________________________________________________________________
+
+
+|:run| |:!| +
+||:!{cmd}||
+________________________________________________________________________________
+Run a command. Runs {cmd} through system() and displays its output. Any \'!' in
+{cmd} is replaced with the previous external command. But not when there is a
+backslash before the \'!', then that backslash is removed.
+
+Warning: Input redirection (< foo) not done, also do not run commands which
+require stdin or it will hang Firefox!
+________________________________________________________________________________
+
+
+|:ve| |:version| +
+||:ve[rsion][!]||
+________________________________________________________________________________
+Show version information. You can show the Firefox version page with
+[c]:version![c].
+________________________________________________________________________________
+
+section:Online{nbsp}help[online-help]
+
+|<F1>| |:help| |:h| |help|
+||:h[elp] [a][subject][a]|| +
+||<F1>||
+________________________________________________________________________________
+Open help window. The default page, as specified by 'helpfile' is shown unless
+[a][subject][a] is specified. If you need help for a specific topic, try
+[c]:help overview[c].
+____________________________________________________________________________
+
+
+|:exu| |:exusage| +
+||:exu[sage][!]||
+________________________________________________________________________________
+Show help on Ex commands. If [!] is given then the help is listed in the
+command output window.
+________________________________________________________________________________
+
+
+|:optionu| |:optionusage| +
+||:optionu[sage][!]||
+________________________________________________________________________________
+Show help on options. If [!] is given then the help is listed in the command
+output window.
+________________________________________________________________________________
+
+
+|:viu| |:viusage| +
+||:viu[sage][!]||
+________________________________________________________________________________
+Show help on Normal mode commands. If [!] is given then the help is listed in
+the command output window.
+________________________________________________________________________________
+
+
+|42| +
+
+What is the meaning of life, the universe and everything?
+Douglas Adams, the only person who knew what this question really was about is
+now dead, unfortunately. So now you might wonder what the meaning of death
+is...
+
+
+section:Uncategorized{nbsp}help[uncategorized]
+
+|<C-[>| |<Esc>| +
+||<Esc>||
+________________________________________________________________________________
+Focus content. Exits Command-line or Hints mode and returns to Normal
+mode. Also focuses the web page in case a form field has focus and eats
+our key presses.
+________________________________________________________________________________
+
+
+|<Insert>| |i| +
+||i||
+________________________________________________________________________________
+Start caret mode. This mode resembles the Vim's Normal mode where you see a
+text cursor and can move around. If you want to select text in this mode, press
+[m]v[m] to start its Visual mode.
+________________________________________________________________________________
+
+// vim: set filetype=asciidoc:
diff --git a/xulmus/locale/en-US/xhtml11.css b/xulmus/locale/en-US/xhtml11.css
new file mode 100755
index 00000000..427cbe99
--- /dev/null
+++ b/xulmus/locale/en-US/xhtml11.css
@@ -0,0 +1,349 @@
+/* keep the mozdev header */
+/* @import url(http://www.mozdev.org/skin/color/mozdev2k.css); */
+
+/*
+ CSS stylesheet for XHTML produced by DocBook XSL stylesheets.
+ Tested with XSL stylesheets 1.61.2, 1.67.2
+*/
+
+span.strong {
+ font-weight: bold;
+}
+
+a {
+ color: #4A708B;
+ text-decoration: none;
+}
+
+body blockquote {
+ margin-top: .75em;
+ line-height: 1.5;
+ margin-bottom: .75em;
+}
+
+html body {
+ /*margin: 1em 5% 1em 5%;*/
+ margin: auto;
+ padding-left: 25px;
+ padding-right: 25px;
+ line-height: 1.2;
+ font-family: -moz-fixed;
+ max-width: 800px;
+}
+
+body div {
+ margin: 0;
+}
+
+h1, h2, h3, h4, h5, h6,
+div.toc p b,
+div.list-of-figures p b,
+div.list-of-tables p b,
+div.abstract p.title
+{
+ color: #527bbd;
+}
+
+div.toc p:first-child,
+div.list-of-figures p:first-child,
+div.list-of-tables p:first-child,
+div.example p.title
+{
+ margin-bottom: 0.1em;
+}
+
+body h1 {
+ margin: .0em 0 0 -4%;
+ line-height: 1.3;
+ border-bottom: 1px solid silver;
+}
+
+body h2 {
+ /* necessary, because we put h2 into tables */
+ margin-top: 20px !important;
+ margin-bottom: 0px !important;
+ line-height: 1.3;
+ /*border-bottom: 1px solid silver;*/
+}
+
+body h3 {
+ margin: .8em 0 0 -3%;
+ line-height: 1.3;
+}
+
+body h4 {
+ margin: .8em 0 0 -3%;
+ line-height: 1.3;
+}
+
+body h5 {
+ margin: .8em 0 0 -2%;
+ line-height: 1.3;
+}
+
+body h6 {
+ margin: .8em 0 0 -1%;
+ line-height: 1.3;
+}
+
+body hr {
+ border: none; /* Broken on IE6 */
+}
+div.footnotes hr {
+ border: 1px solid silver;
+}
+
+div.navheader th, div.navheader td, div.navfooter td {
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #527bbd;
+}
+div.navheader img, div.navfooter img {
+ border-style: none;
+}
+div.navheader a, div.navfooter a {
+ font-weight: normal;
+}
+div.navfooter hr {
+ border: 1px solid silver;
+}
+
+body td {
+ line-height: 1.2
+}
+
+body th {
+ line-height: 1.2;
+}
+
+ol {
+ line-height: 1.2;
+}
+
+ul, body dir, body menu {
+ line-height: 1.2;
+}
+
+html {
+ margin: 0;
+ padding: 0;
+}
+
+body h1, body h2, body h3, body h4, body h5, body h6 {
+ margin-left: 0
+}
+
+body pre {
+ margin: 0.5em 10% 0.5em 1em;
+ line-height: 1.2;
+ color: navy;
+}
+
+tt.literal, code.literal {
+ color: navy;
+}
+
+
+.programlisting, .screen, .listingblock {
+ border: 1px solid silver;
+ background: #f4f4f4;
+ margin: 0.5em 10% 0.5em 0;
+ padding: 0.5em 1em;
+}
+
+div.sidebar {
+ background: #ffffee;
+ margin: 1.0em 10% 0.5em 0;
+ padding: 0.5em 1em;
+ border: 1px solid silver;
+}
+div.sidebar * { padding: 0; }
+div.sidebar div { margin: 0; }
+div.sidebar p.title {
+ margin-top: 0.5em;
+ margin-bottom: 0.2em;
+}
+
+div.bibliomixed {
+ margin: 0.5em 5% 0.5em 1em;
+}
+
+#footer {
+ margin: 15px;
+ text-align: center;
+ color: gray;
+}
+
+div.glossary dt {
+ font-weight: bold;
+}
+div.glossary dd p {
+ margin-top: 0.2em;
+}
+
+dl {
+ margin: .8em 0;
+ line-height: 1.2;
+}
+
+dt {
+ margin-top: 0.5em;
+}
+
+dt span.term {
+ font-style: italic;
+}
+
+div.variablelist dd p {
+ margin-top: 0;
+}
+
+div.itemizedlist li, div.orderedlist li {
+ margin-left: -0.8em;
+ margin-top: 0.5em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+
+div.sidebar ul, div.sidebar ol {
+ margin-left: 2.8em;
+}
+
+div.itemizedlist p.title,
+div.orderedlist p.title,
+div.variablelist p.title
+{
+ margin-bottom: -0.8em;
+}
+
+div.revhistory table {
+ border-collapse: collapse;
+ border: none;
+}
+div.revhistory th {
+ border: none;
+ color: #527bbd;
+}
+div.revhistory td {
+ border: 1px solid silver;
+}
+
+/* Keep TOC and index lines close together. */
+div.toc dl, div.toc dt,
+div.list-of-figures dl, div.list-of-figures dt,
+div.list-of-tables dl, div.list-of-tables dt,
+div.indexdiv dl, div.indexdiv dt
+{
+ line-height: normal;
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+/*
+ Table styling does not work because of overriding attributes in
+ generated HTML.
+*/
+div.table table,
+div.informaltable table
+{
+ margin-left: 0;
+ margin-right: 5%;
+ margin-bottom: 0.8em;
+}
+div.informaltable table
+{
+ margin-top: 0.4em
+}
+div.table thead,
+div.table tfoot,
+div.table tbody,
+div.informaltable thead,
+div.informaltable tfoot,
+div.informaltable tbody
+{
+ /* No effect in IE6. */
+ border-top: 2px solid #527bbd;
+ border-bottom: 2px solid #527bbd;
+}
+div.table thead, div.table tfoot,
+div.informaltable thead, div.informaltable tfoot
+{
+ font-weight: bold;
+}
+
+div.mediaobject img {
+ border: 1px solid silver;
+ margin-bottom: 0.8em;
+}
+div.figure p.title,
+div.table p.title
+{
+ margin-top: 1em;
+ margin-bottom: 0.4em;
+}
+
+@media print {
+ div.navheader, div.navfooter { display: none; }
+}
+
+/* my additions */
+span.tag, span.hiddentag {
+ font-weight: bold;
+ color: rgb(255, 0, 255); /* magenta */
+ padding-left: 15px;
+ float: right;
+}
+/* inside a table cell means this tag is part of a section */
+td span.tag {
+ padding-top: 25px !important;
+}
+
+div.key {
+ color: rgb(255, 0, 255); /* magenta */
+ min-width: 120px; /* with 20px padding actually 140px */
+ /*padding-bottom: 5px;*/
+ padding-right: 20px;
+ float: left;
+}
+span.warning {
+ font-weight: bold;
+ color: red;
+}
+span.info {
+ font-weight: bold;
+ color: blue;
+}
+fieldset.paypal {
+ border: none;
+}
+
+.argument {
+ color: #6A97D4;
+}
+.command {
+ font-weight: bold;
+ color: #632610;
+ white-space: nowrap;
+}
+.mapping {
+ font-weight: bold;
+ color: #102663;
+}
+.option {
+ font-weight: bold;
+ color: #106326;
+}
+
+.option, .mapping, .command {
+ text-decoration: none;
+}
+.option:hover, .mapping:hover, .command:hover {
+ text-decoration: underline;
+}
+
+.quoteblock {
+ margin-left: 140px;
+ padding-bottom: 10px;
+}
diff --git a/xulmus/skin/icon.png b/xulmus/skin/icon.png
new file mode 100755
index 00000000..e821ed66
--- /dev/null
+++ b/xulmus/skin/icon.png
Binary files differ
diff --git a/xulmus/vimperatorrc.example b/xulmus/vimperatorrc.example
new file mode 100755
index 00000000..1991c4c4
--- /dev/null
+++ b/xulmus/vimperatorrc.example
@@ -0,0 +1,21 @@
+" TODO: add some useful examples
+
+" I don't like beeps
+set visualbell
+
+" autoignore mode on certain pages
+:autocmd PageLoad .* :js modes.passAllKeys = /gmail\.com/.test(buffer.URL)
+
+
+" embedded javascript is possible
+" You can even add new functions which are then available in the :js command
+javascript <<EOF
+hello = function(name)
+{
+ alert("Hello world: " + name);
+}
+EOF
+
+echo "vimperatorrc sourced"
+
+" vim: ft=vimperator: