aboutsummaryrefslogtreecommitdiffstats
path: root/background_scripts/commands.js
diff options
context:
space:
mode:
Diffstat (limited to 'background_scripts/commands.js')
-rw-r--r--background_scripts/commands.js252
1 files changed, 252 insertions, 0 deletions
diff --git a/background_scripts/commands.js b/background_scripts/commands.js
new file mode 100644
index 00000000..83ef050f
--- /dev/null
+++ b/background_scripts/commands.js
@@ -0,0 +1,252 @@
+var availableCommands = {};
+var keyToCommandRegistry = {};
+
+/*
+ * Registers a command, making it available to be optionally bound to a key.
+ * options:
+ * - background: whether this command needs to be run against the background page.
+ * - passCountToFunction: true if this command should have any digits which were typed prior to the
+ * command passed to it. This is used to implement e.g. "closing of 3 tabs".
+ */
+function addCommand(command, description, options) {
+ if (availableCommands[command]) {
+ console.log(command, "is already defined! Check commands.js for duplicates.");
+ return;
+ }
+
+ options = options || {};
+ availableCommands[command] = { description: description,
+ isBackgroundCommand: options.background,
+ passCountToFunction: options.passCountToFunction
+ };
+}
+
+function mapKeyToCommand(key, command) {
+ if (!availableCommands[command]) {
+ console.log(command, "doesn't exist!");
+ return;
+ }
+
+ keyToCommandRegistry[key] = { command: command,
+ isBackgroundCommand: availableCommands[command].isBackgroundCommand,
+ passCountToFunction: availableCommands[command].passCountToFunction
+ };
+}
+
+function unmapKey(key) { delete keyToCommandRegistry[key]; }
+
+/* Lower-case the appropriate portions of named keys.
+ *
+ * A key name is one of three forms exemplified by <c-a> <left> or <c-f12>
+ * (prefixed normal key, named key, or prefixed named key). Internally, for
+ * simplicity, we would like prefixes and key names to be lowercase, though
+ * humans may prefer other forms <Left> or <C-a>.
+ * On the other hand, <c-a> and <c-A> are different named keys - for one of
+ * them you have to press "shift" as well.
+ */
+function normalizeKey(key) {
+ return key.replace(/<[acm]-/ig, function(match){ return match.toLowerCase(); })
+ .replace(/<([acm]-)?([a-zA-Z0-9]{2,5})>/g, function(match, optionalPrefix, keyName){
+ return "<" + ( optionalPrefix ? optionalPrefix : "") + keyName.toLowerCase() + ">";
+ });
+}
+
+function parseCustomKeyMappings(customKeyMappings) {
+ lines = customKeyMappings.split("\n");
+
+ for (var i = 0; i < lines.length; i++) {
+ if (lines[i][0] == "\"" || lines[i][0] == "#") { continue }
+ split_line = lines[i].split(/\s+/);
+
+ var lineCommand = split_line[0];
+
+ if (lineCommand == "map") {
+ if (split_line.length != 3) { continue; }
+ var key = normalizeKey(split_line[1]);
+ var vimiumCommand = split_line[2];
+
+ if (!availableCommands[vimiumCommand]) { continue }
+
+ console.log("Mapping", key, "to", vimiumCommand);
+ mapKeyToCommand(key, vimiumCommand);
+ }
+ else if (lineCommand == "unmap") {
+ if (split_line.length != 2) { continue; }
+
+ var key = normalizeKey(split_line[1]);
+
+ console.log("Unmapping", key);
+ unmapKey(key);
+ }
+ else if (lineCommand == "unmapAll") {
+ keyToCommandRegistry = {};
+ }
+ }
+}
+
+function clearKeyMappingsAndSetDefaults() {
+ keyToCommandRegistry = {};
+
+ var defaultKeyMappings = {
+ "?": "showHelp",
+ "j": "scrollDown",
+ "k": "scrollUp",
+ "h": "scrollLeft",
+ "l": "scrollRight",
+ "gg": "scrollToTop",
+ "G": "scrollToBottom",
+ "zH": "scrollToLeft",
+ "zL": "scrollToRight",
+ "<c-e>": "scrollDown",
+ "<c-y>": "scrollUp",
+
+ "d": "scrollPageDown",
+ "u": "scrollPageUp",
+ "r": "reload",
+ "gs": "toggleViewSource",
+
+ "i": "enterInsertMode",
+
+ "H": "goBack",
+ "L": "goForward",
+ "gu": "goUp",
+
+ "gi": "focusInput",
+
+ "f": "linkHints.activateMode",
+ "F": "linkHints.activateModeToOpenInNewTab",
+ "<a-f>": "linkHints.activateModeWithQueue",
+
+ "/": "enterFindMode",
+ "n": "performFind",
+ "N": "performBackwardsFind",
+
+ "[[": "goPrevious",
+ "]]": "goNext",
+
+ "yy": "copyCurrentUrl",
+ "yf": "linkHints.activateModeToCopyLinkUrl",
+
+ "p": "openCopiedUrlInCurrentTab",
+ "P": "openCopiedUrlInNewTab",
+
+ "K": "nextTab",
+ "J": "previousTab",
+ "gt": "nextTab",
+ "gT": "previousTab",
+ "g0": "firstTab",
+ "g$": "lastTab",
+
+ "t": "createTab",
+ "x": "removeTab",
+ "X": "restoreTab",
+
+ "o": "vomnibar.activate",
+ "O": "vomnibar.activateWithCurrentUrl",
+
+ "T": "vomnibar.activateTabSelection",
+
+ "gf": "nextFrame",
+ };
+
+ for (var key in defaultKeyMappings)
+ mapKeyToCommand(key, defaultKeyMappings[key]);
+}
+
+// This is a mapping of: commandIdentifier => [description, options].
+var commandDescriptions = {
+ // Navigating the current page
+ showHelp: ["Show help", { background: true }],
+ scrollDown: ["Scroll down"],
+ scrollUp: ["Scroll up"],
+ scrollLeft: ["Scroll left"],
+ scrollRight: ["Scroll right"],
+ scrollToTop: ["Scroll to the top of the page"],
+ scrollToBottom: ["Scroll to the bottom of the page"],
+ scrollToLeft: ["Scroll all the way to the left"],
+
+ scrollToRight: ["Scroll all the way to the right"],
+ scrollPageDown: ["Scroll a page down"],
+ scrollPageUp: ["Scroll a page up"],
+ scrollFullPageDown: ["Scroll a full page down"],
+ scrollFullPageUp: ["Scroll a full page up"],
+
+ reload: ["Reload the page"],
+ toggleViewSource: ["View page source"],
+
+ copyCurrentUrl: ["Copy the current URL to the clipboard"],
+ 'linkHints.activateModeToCopyLinkUrl': ["Copy a link URL to the clipboard"],
+ openCopiedUrlInCurrentTab: ["Open the clipboard's URL in the current tab", { background: true }],
+ openCopiedUrlInNewTab: ["Open the clipboard's URL in a new tab", { background: true }],
+
+ enterInsertMode: ["Enter insert mode"],
+
+ focusInput: ["Focus the first (or n-th) text box on the page", { passCountToFunction: true }],
+
+ 'linkHints.activateMode': ["Open a link in the current tab"],
+ 'linkHints.activateWithCurrentUrl': ["Open a link in a new tab"],
+ 'linkHints.activateModeWithQueue': ["Open multiple links in a new tab"],
+
+ enterFindMode: ["Enter find mode"],
+ performFind: ["Cycle forward to the next find match"],
+ performBackwardsFind: ["Cycle backward to the previous find match"],
+
+ goPrevious: ["Follow the link labeled previous or <"],
+ goNext: ["Follow the link labeled next or >"],
+
+ // Navigating your history
+ goBack: ["Go back in history", { passCountToFunction: true }],
+ goForward: ["Go forward in history", { passCountToFunction: true }],
+
+ // Navigating the URL hierarchy
+ goUp: ["Go up the URL hierarchy", { passCountToFunction: true }],
+
+ // Manipulating tabs
+ nextTab: ["Go one tab right", { background: true }],
+ previousTab: ["Go one tab left", { background: true }],
+ firstTab: ["Go to the first tab", { background: true }],
+ lastTab: ["Go to the last tab", { background: true }],
+ createTab: ["Create new tab", { background: true }],
+ removeTab: ["Close current tab", { background: true }],
+ restoreTab: ["Restore closed tab", { background: true }],
+
+ "vomnibar.activate": ["Open URL, bookmark, or history entry"],
+ "vomnibar.activateWithCurrentUrl": ["Open URL, bookmark, history entry, starting with the current URL"],
+ "vomnibar.activateTabSelection": ["Search through your open tabs"],
+
+ nextFrame: ["Cycle forward to the next frame on the page", { background: true, passCountToFunction: true }]
+};
+
+for (var command in commandDescriptions)
+ addCommand(command, commandDescriptions[command][0], commandDescriptions[command][1]);
+
+
+// An ordered listing of all available commands, grouped by type. This is the order they will
+// be shown in the help page.
+var commandGroups = {
+ pageNavigation:
+ ["scrollDown", "scrollUp", "scrollLeft", "scrollRight",
+ "scrollToTop", "scrollToBottom", "scrollToLeft", "scrollToRight", "scrollPageDown",
+ "scrollPageUp", "scrollFullPageUp", "scrollFullPageDown",
+ "reload", "toggleViewSource", "copyCurrentUrl", "linkHints.activateModeToCopyLinkUrl",
+ "openCopiedUrlInCurrentTab", "openCopiedUrlInNewTab", "goUp",
+ "enterInsertMode", "focusInput",
+ "linkHints.activateMode", "linkHints.activateModeToOpenInNewTab", "linkHints.activateModeWithQueue",
+ "vomnibar.activate", "vomnibar.activateWithCurrentUrl", "vomnibar.activateTabSelection",
+ "goPrevious", "goNext", "nextFrame"],
+ findCommands: ["enterFindMode", "performFind", "performBackwardsFind"],
+ historyNavigation:
+ ["goBack", "goForward"],
+ tabManipulation:
+ ["nextTab", "previousTab", "firstTab", "lastTab", "createTab", "removeTab", "restoreTab"],
+ misc:
+ ["showHelp"]
+};
+
+// Rarely used commands are not shown by default in the help dialog or in the README. The goal is to present
+// a focused, high-signal set of commands to the new and casual user. Only those truly hungry for more power
+// from Vimium will uncover these gems.
+var advancedCommands = [
+ "scrollToLeft", "scrollToRight",
+ "goUp", "focusInput", "linkHints.activateModeWithQueue",
+ "goPrevious", "goNext"];