diff options
| author | Phil Crosby | 2012-06-10 22:59:24 -0700 |
|---|---|---|
| committer | Phil Crosby | 2012-06-12 22:00:34 -0700 |
| commit | d4c6b5708a6c388026dc348b81dd168b345d60de (patch) | |
| tree | 76781720af45fc0c6aa71c2605ce8ab72cfa85f1 /background_scripts/commands.coffee | |
| parent | 83b11294b06968ca71046098b8b0d0e3268cc7fe (diff) | |
| download | vimium-d4c6b5708a6c388026dc348b81dd168b345d60de.tar.bz2 | |
Port commands.js to coffeescript
Diffstat (limited to 'background_scripts/commands.coffee')
| -rw-r--r-- | background_scripts/commands.coffee | 240 |
1 files changed, 240 insertions, 0 deletions
diff --git a/background_scripts/commands.coffee b/background_scripts/commands.coffee new file mode 100644 index 00000000..0d689043 --- /dev/null +++ b/background_scripts/commands.coffee @@ -0,0 +1,240 @@ +Commands = + init: -> + for command of commandDescriptions + @addCommand(command, commandDescriptions[command][0], commandDescriptions[command][1]) + + availableCommands: {} + 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". + addCommand: (command, description, options) -> + if @availableCommands[command] + console.log(command, "is already defined! Check commands.js for duplicates.") + return + + options ||= {} + @availableCommands[command] = + description: description + isBackgroundCommand: options.background + passCountToFunction: options.passCountToFunction + + mapKeyToCommand: (key, command) -> + unless @availableCommands[command] + console.log(command, "doesn't exist!") + return + + @keyToCommandRegistry[key] = + command: command + isBackgroundCommand: @availableCommands[command].isBackgroundCommand + passCountToFunction: @availableCommands[command].passCountToFunction + + 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. + normalizeKey: (key) -> + key.replace(/<[acm]-/ig, (match) -> match.toLowerCase()) + .replace(/<([acm]-)?([a-zA-Z0-9]{2,5})>/g, (match, optionalPrefix, keyName) -> + "<" + (if optionalPrefix then optionalPrefix else "") + keyName.toLowerCase() + ">") + + parseCustomKeyMappings: (customKeyMappings) -> + lines = customKeyMappings.split("\n") + + for line in lines + continue if (line[0] == "\"" || line[0] == "#") + split_line = line.split(/\s+/) + + lineCommand = split_line[0] + + if (lineCommand == "map") + continue if (split_line.length != 3) + key = @normalizeKey(split_line[1]) + vimiumCommand = split_line[2] + + continue unless @availableCommands[vimiumCommand] + + console.log("Mapping", key, "to", vimiumCommand) + @mapKeyToCommand(key, vimiumCommand) + else if (lineCommand == "unmap") + continue if (split_line.length != 2) + + key = @normalizeKey(split_line[1]) + console.log("Unmapping", key) + @unmapKey(key) + else if (lineCommand == "unmapAll") + @keyToCommandRegistry = {} + + clearKeyMappingsAndSetDefaults: -> + @keyToCommandRegistry = {} + + for key of defaultKeyMappings + @mapKeyToCommand(key, defaultKeyMappings[key]) + + # An ordered listing of all available commands, grouped by type. This is the order they will + # be shown in the help page. + 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. + advancedCommands: [ + "scrollToLeft", "scrollToRight", + "goUp", "focusInput", "linkHints.activateModeWithQueue", + "goPrevious", "goNext"] + +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" + + +# This is a mapping of: commandIdentifier => [description, options]. +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.activateModeToOpenInNewTab': ["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 }] + +Commands.init() + +root = exports ? window +root.Commands = Commands |
