diff options
Diffstat (limited to 'background_scripts/commands.js')
| -rw-r--r-- | background_scripts/commands.js | 252 | 
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"]; | 
