 
     @rowMap.applyBufferDelta(startBufferRow, bufferDelta)
 
+    { newScreenLines, newMappings } = @buildScreenLines(startBufferRow, endBufferRow + bufferDelta)
+    @screenLines[startScreenRow...endScreenRow] = newScreenLines
+    screenDelta = newScreenLines.length - (endScreenRow - startScreenRow)
+    @rowMap.applyScreenDelta(startScreenRow, screenDelta)
+    @rowMap.mapBufferRowRange(mapping...) for mapping in newMappings
+    @findMaxLineLength(startScreenRow, endScreenRow, newScreenLines)
+
+    return if options.suppressChangeEvent
+
+    changeEvent =
+      start: startScreenRow
+      end: endScreenRow - 1
+      screenDelta: screenDelta
+      bufferDelta: bufferDelta
+
+    if options.delayChangeEvent
+      @pauseMarkerObservers()
+      @pendingChangeEvent = changeEvent
+    else
+      @triggerChanged(changeEvent, options.refreshMarkers)
+
+  buildScreenLines: (startBufferRow, endBufferRow) ->
     newScreenLines = []
     newMappings = []
     pendingIsoMapping = null

  setSoftWrapColumn: (@softWrapColumn) ->
    start = 0
    end = @getLastRow()
    @buildScreenLines()
    screenDelta = @getLastRow() - end
    bufferDelta = 0
    @triggerChanged({ start, end, screenDelta, bufferDelta })

        @longestScreenRow = maxLengthCandidatesStartRow + screenRow
        @maxLineLength = length

  handleMarkersUpdated: =>
    event = @pendingChangeEvent
    @pendingChangeEvent = null
