   execute: ->
     @withUndoJoin =>
       selections = @editor.getSelectionsOrderedByBufferPosition()
+      topSelection = selections[0]
       selections.reverse() if @direction is 'down'
       @initOverwrittenByEditor()
       @editor.transact =>
         @countTimes =>
+          return if (not @isLinewise()) and (not @isMovable(topSelection))
+
           for selection, i in selections
             @selectionIndex = i
             @selectionIndex = selections.length - (i + 1) if @direction is 'down'
+            @extendMovingArea(selection)
             @mutate(selection) if @isMovable(selection)
 
   initOverwrittenByEditor: ->

      when 'right' then selection.indentSelectedRows()
      when 'left' then selection.outdentSelectedRows()

  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

  moveCharacterwise: (selection) ->
    reversed = selection.isReversed()

    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
  # -------------------------
