   needFlash: ->
     @flashTarget and settings.get('flashOnOperate') and not @instanceof('Select')
 
+  needTrackChange: ->
+    @trackChange
+
   needStay: ->
     param = if @instanceof('TransformString')
       "stayOnTransformString"

    {text, type} = @vimState.register.get()
    return unless text
    text = _.multiplyString(text, @getCount())
    paste = switch
      when type is 'linewise', @vimState.isMode('visual', 'linewise')
        @pasteLinewise
      when 'character'
        @pasteCharacterwise

    @editor.transact =>
      paste(s, text) for s in @editor.getSelections()
    @activate('normal')

  pasteLinewise: (selection, text) => # fat
    cursor = selection.cursor
    if selection.isEmpty()
      if @location is 'before'
        cursor.moveToBeginningOfLine()
        selection.insertText("\n")
        cursor.moveUp()
      else
        cursor.moveToEndOfLine()
        selection.insertText("\n")
      text = text.replace(/\n$/, '')
    else
      if @vimState.isMode('visual', 'linewise')
        text += '\n' unless text.endsWith('\n')
      else
        selection.insertText("\n")
    range = selection.insertText(text)
    @setMarkForChange(range)
    @flash range
    cursor.setBufferPosition(range.start)
    cursor.moveToFirstCharacterOfLine()

  pasteCharacterwise: (selection, text) => # fat
    cursor = selection.cursor
    if @location is 'after' and selection.isEmpty()
      cursor.moveRight()
    range = selection.insertText(text)
    @setMarkForChange(range)

    @flash range
    cursor.setBufferPosition(range.end.translate([0, -1]))

class PutAfter extends PutBefore
  @extend()

  @extend()
  submode: 'replace'

  repeatInsert: (selection, text) ->
    for char in text when char isnt "\n"
      break if selection.cursor.isAtEndOfLine()
      selection.selectRight()
