 class DuplicateSelectedTextDown extends DuplicateSelectedTextUp
   direction: 'down'
 
-class DuplicateSelectedTextLeft extends DuplicateSelectedTextUp
+# Left/Right
+class DuplicateSelectedTextLeft extends DuplicateSelectedText
   direction: 'left'
 
+  # No behavior-diff by 'isOverwriteMode'
   duplicateLinewise: (selection, count) ->
     getText = ->
       swrap(selection).lineTextForBufferRows()
         .map (text) -> text.repeat(count+1)
         .join("\n") + "\n"
 
+    getRange = ->
+      selection.getBufferRange()
+
     @withLinewise selection, ->
-      text = getText()
-      range = selection.getBufferRange()
-      setTextInRangeAndSelect(range, text, selection)
+      setTextInRangeAndSelect(getRange(), getText(), selection)
 
   duplicateCharacterwise: (selection, count) ->
-    getRangeToInsert = (text) =>
+    getText = ->
+      selection.getText().repeat(count)
+
+    getRange = =>
+      width = getText().length
       {start, end} = selection.getBufferRange()
-      if @isOverwriteMode()
-        width = text.length
-        switch @direction
-          when 'right' then [end, end.translate([0, +width])]
-          when 'left' then [start.translate([0, -width]), start]
-      else
-        switch @direction
-          when 'right' then [end, end]
-          when 'left' then [start, start]
-
-    text = selection.getText().repeat(count)
-    range = getRangeToInsert(text)
-    setTextInRangeAndSelect(range, text, selection)
+      switch @direction
+        when 'right'
+          range = new Range(end, end)
+          if @isOverwriteMode()
+            range.end = range.end.translate([0, +width])
+          range
+        when 'left'
+          range = new Range(start, start)
+          if @isOverwriteMode()
+            range.start = range.start.translate([0, -width])
+          range
+
+    setTextInRangeAndSelect(getRange(), getText(), selection)
 
 class DuplicateSelectedTextRight extends DuplicateSelectedTextLeft
   direction: 'right'

      when 'right' then selection.indentSelectedRows()

  moveCharacterwise: (selection) ->
    return unless @canMoveSelection(selection)
    if @direction is 'right'
      endPoint = selection.getBufferRange().end
      insertTextAtPoint(@editor, endPoint, " ") if pointIsAtEndOfLine(@editor, endPoint)

        else
          @duplicateCharacterwise(selection, count)

# Up/Down
class DuplicateSelectedTextUp extends DuplicateSelectedText
  direction: 'up'
  withBlockwise: (fn) ->
