       which = if direction == forward then "start" else "end"
       @selection.extend original["#{which}Container"], original["#{which}Offset"]
 
-  # Run a movement command.  The movement should be a string of the form "direction amount", e.g. "forward
-  # word".
+  # Run a movement command.  The single movement argument can be a string of the form "direction amount", e.g.
+  # "forward word", or a list, e.g. [ "forward", "word" ].
   runMovement: (movement) ->
-    @selection.modify @alterMethod, movement.split(" ")...
+    movement = movement.split(" ") if typeof movement == "string"
+    @selection.modify @alterMethod, movement...
 
   # Try to move one character in "direction".  Return 1, -1 or 0, indicating whether the selection got bigger,
   # or smaller, or is unchanged.

      "V": -> new VisualLineMode extend @options, initialRange: @selection.getRangeAt(0).cloneRange()
      "y": ->
        # Special case: "yy" (the first from edit mode, and now the second).
        @selectLine() if @options.yYanksLine and @keyPressCount == 1
        @yank()

    if @options.underEditMode
      extend @commands,
        "c": -> @yank(); enterInsertMode()
        "d": ->
          # Special case: "dd" (the first from edit mode, and now the second).
          @selectLine() if @options.dYanksLine and @keyPressCount == 1
          @yank deleteFromDocument: true

    unless @options.underEditMode
      @installFindMode()

      "D": => @enterVisualMode runMovement: "$", deleteFromDocument: true
      "C": => @enterVisualMode runMovement: "$", deleteFromDocument: true, onYank: enterInsertMode

      # Disabled as potentially confusing.
      # # If the input is empty, then enter insert mode immediately
      # unless @element.isContentEditable
      #   if @element.value.trim() == ""
      #     enterInsertMode()
      #     HUD.showForDuration "Input empty, entered insert mode directly.", 3500

  enterVisualMode: (options = {}) ->
    defaults =
