aboutsummaryrefslogtreecommitdiffstats
path: root/background_scripts/commands.coffee
diff options
context:
space:
mode:
Diffstat (limited to 'background_scripts/commands.coffee')
-rw-r--r--background_scripts/commands.coffee240
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