       when 'right' then selection.indentSelectedRows()
       when 'left' then selection.outdentSelectedRows()
 
+  extendMovingArea: (selection) ->
+    if not @isLinewise() and @direction is 'right'
+      {start, end} = selection.getBufferRange()
+      if pointIsAtEndOfLine(@editor, end)
+        @editor.setTextInBufferRange([end, end], " ")
+
   isMovable: (selection) ->
     if @isLinewise()
       true
     else
-      {start, end} = selection.getBufferRange()
       switch @direction
-        when 'right'
-          if pointIsAtEndOfLine(@editor, end)
-            @editor.setTextInBufferRange([end, end], " ")
-          true
-        when 'left'
-          start.column isnt 0
+        when 'right' then true
+        when 'left' then selection.getBufferRange().start.column isnt 0
 
   moveCharacterwise: (selection) ->
     reversed = selection.isReversed()

  execute: ->
    @withUndoJoin =>
      selections = @editor.getSelectionsOrderedByBufferPosition()
      selections.reverse() if @direction is 'down'
      @initOverwrittenByEditor()
      @editor.transact =>
        @countTimes =>
          for selection, i in selections
            @selectionIndex = i
            @selectionIndex = selections.length - (i + 1) if @direction is 'down'
            @mutate(selection) if @isMovable(selection)

  initOverwrittenByEditor: ->

    else
      @moveCharacterwise(selection)

  extendMovingArea: (selection) ->
    if @direction is 'down'
      endRow = selection.getBufferRange().end.row
      if endRow >= getVimLastBufferRow(@editor)
        eof = @editor.getEofBufferPosition()
        @editor.setTextInBufferRange([eof, eof], "\n")

  isMovable: (selection) ->
    switch @direction
      when 'up' then selection.getBufferRange().start.row isnt 0
      when 'down' then true

  # Characterwise
  # -------------------------
