 
 class MoveSelectedTextRight extends MoveSelectedTextLeft
   @registerCommand()
+
   moveLinewise: (selection) ->
     selection.indentSelectedRows()
 
 # Duplicate
 # -------------------------
-class DuplicateSelectedTextBase extends Operator
-  @commandScope: 'atom-text-editor.vim-mode-plus.visual-mode'
-  @commandPrefix: 'vim-mode-plus-user'
-  flashTarget: false
-  isOverwriteMode: ->
-    atom.config.get('vim-mode-plus-move-selected-text.overwrite')
+class DuplicateSelectedText extends MoveOrDuplicateSelectedText
 
-  execute: ->
-    console.log "still not implemented #{@getName()}"
+class DuplicateSelectedTextUp extends DuplicateSelectedText
+  @registerCommand()
 
-class DuplicateSelectedTextUp extends DuplicateSelectedTextBase
-  @registerCommand()
 class DuplicateSelectedTextDown extends DuplicateSelectedTextUp
   @registerCommand()
 
-class DuplicateSelectedTextLeft extends DuplicateSelectedTextBase
+class DuplicateSelectedTextLeft extends DuplicateSelectedText
   @registerCommand()
+
 class DuplicateSelectedTextRight extends DuplicateSelectedTextLeft
   @registerCommand()
 

    @editor.transact(fn)
    stateManager.groupChanges(@editor)

class MoveSelectedTextUp extends MoveSelectedTextBase
  @registerCommand()
  direction: 'up'


stateManager = new StateManager()
# Move
# -------------------------
class MoveOrDuplicateSelectedText extends Operator
  @registerCommand: ->
    commandSubscriptions.add(super)

  @commandScope: 'atom-text-editor.vim-mode-plus.visual-mode'
  @commandPrefix: 'vim-mode-plus-user'
  flashTarget: false

  isOverwriteMode: ->
    atom.config.get('vim-mode-plus-move-selected-text.overwrite')

