       when 'right' then selection.indentSelectedRows()
 
   moveCharacterwise: (selection) ->
-    return unless @canMoveSelection(selection)
+    if @direction is 'left'
+      return unless selection.getBufferRange().start.column > 0
+
     if @direction is 'right'
       endPoint = selection.getBufferRange().end
       insertTextAtPoint(@editor, endPoint, " ") if pointIsAtEndOfLine(@editor, endPoint)

      @vimState.activate('visual', 'characterwise')

  execute: ->
    if @isLinewise() or (not @isLinewise() and (@direction in ['right', 'left']))
      super
    else
      @editor.transact =>
        return if (count = @getCount()) is 0
        @withBlockwise =>
          if @direction is 'down'
            bottom = _.last(@editor.getSelectionsOrderedByBufferPosition())
            range = bottom.getBufferRange()
            if range.end.row is @editor.getLastBufferRow()
              # Since inserting new line modify selected range
              # We have to revert selction range to preserved one.
              ensureBufferEndWithNewLine(@editor)
              bottom.setBufferRange(range)

          bss = @vimState.getBlockwiseSelectionsOrderedByBufferPosition()
          bss.reverse() if @direction is 'down'
          for bs in bss
            @duplicateCharacterwise(bs, count)

  duplicateLinewise: (selection, count) ->
    getText = ->

    fn(selection)
    disposable?.dispose()

# Up/Down
class MoveSelectedTextUp extends MoveSelectedText
  direction: 'up'

