diff --git a/src/editor-component.coffee b/src/editor-component.coffee index f21d70a38..e8f14b9f2 100644 --- a/src/editor-component.coffee +++ b/src/editor-component.coffee @@ -15,7 +15,8 @@ EditorCompont = React.createClass pendingScrollTop: null pendingScrollLeft: null selectOnMouseMove: false - + batchingUpdates: false + updateRequested: false render: -> {focused, fontSize, lineHeight, fontFamily, showIndentGuide} = @state @@ -74,6 +75,8 @@ EditorCompont = React.createClass observeEditor: -> {editor} = @props + @subscribe editor, 'batched-updates-started', @onBatchedUpdatesStarted + @subscribe editor, 'batched-updates-ended', @onBatchedUpdatesEnded @subscribe editor, 'screen-lines-changed', @onScreenLinesChanged @subscribe editor, 'selection-screen-range-changed', @requestUpdate @subscribe editor, 'selection-added', @onSelectionAdded @@ -258,6 +261,16 @@ EditorCompont = React.createClass event.preventDefault() + onBatchedUpdatesStarted: -> + @batchingUpdates = true + + onBatchedUpdatesEnded: -> + updateRequested = @updateRequested + @updateRequested = false + @batchingUpdates = false + if updateRequested + @forceUpdate() + onScreenLinesChanged: ({start, end}) -> {editor} = @props @requestUpdate() if editor.intersectsVisibleRowRange(start, end + 1) # TODO: Use closed-open intervals for change events @@ -284,7 +297,10 @@ EditorCompont = React.createClass clearVisibleRowOverridesAfterDelay: null requestUpdate: -> - @forceUpdate() + if @batchingUpdates + @updateRequested = true + else + @forceUpdate() updateModelDimensions: -> @refs.scrollView.updateModelDimensions() diff --git a/src/editor.coffee b/src/editor.coffee index 09dedff86..8e1fb37f4 100644 --- a/src/editor.coffee +++ b/src/editor.coffee @@ -1781,7 +1781,9 @@ class Editor extends Model # execution and revert any changes performed up to the abortion. # # fn - A {Function} to call inside the transaction. - transact: (fn) -> @buffer.transact(fn) + transact: (fn) -> + @batchUpdates => + @buffer.transact(fn) # Public: Start an open-ended transaction. # @@ -1801,6 +1803,11 @@ class Editor extends Model # within the transaction. abortTransaction: -> @buffer.abortTransaction() + batchUpdates: (fn) -> + @emit 'batched-updates-started' + fn() + @emit 'batched-updates-ended' + inspect: -> ""