 
     @languageMode = new LanguageMode(this)
 
-    @subscribe @$scrollTop, (scrollTop) => @emit 'scroll-top-changed', scrollTop
-    @subscribe @$scrollLeft, (scrollLeft) => @emit 'scroll-left-changed', scrollLeft
+    @subscribe @$scrollTop, (scrollTop) =>
+      @emit 'scroll-top-changed', scrollTop
+      @emitter.emit 'did-change-scroll-top', scrollTop
+    @subscribe @$scrollLeft, (scrollLeft) =>
+      @emit 'scroll-left-changed', scrollLeft
+      @emitter.emit 'did-change-scroll-left', scrollLeft
 
     @subscribe atom.config.observe 'editor.showInvisibles', callNow: false, (show) => @updateInvisibles()
     @subscribe atom.config.observe 'editor.invisibles', callNow: false, => @updateInvisibles()

      @emitter.emit 'did-change-title', @getTitle()
      @emit "path-changed"
      @emitter.emit 'did-change-path', @getPath()
    @subscribe @buffer.onDidStopChanging => @emit "contents-modified"
    @subscribe @buffer.onDidConflict => @emit "contents-conflicted"
    @subscribe @buffer.onDidChangeModified => @emit "modified-status-changed"
    @subscribe @buffer.onDidDestroy => @destroy()
    @preserveCursorPositionOnBufferReload()

  subscribeToDisplayBuffer: ->

      when 'screen-lines-changed'
        deprecate("Use Editor::onDidChangeScreenLines instead")

      when 'scroll-top-changed'
        deprecate("Use Editor::onDidChangeScrollTop instead")
      when 'scroll-left-changed'
        deprecate("Use Editor::onDidChangeScrollLeft instead")

    EmitterMixin::on.apply(this, arguments)

  # Retrieves the current {TextBuffer}.
