diff --git a/spec/app/edit-session-spec.coffee b/spec/app/edit-session-spec.coffee index eab51e8fc..9bfd89c11 100644 --- a/spec/app/edit-session-spec.coffee +++ b/spec/app/edit-session-spec.coffee @@ -1678,6 +1678,28 @@ describe "EditSession", -> expect(editSession.getSelectedBufferRange()).toEqual [[2, 2], [3, 3]] expect(otherEditSession.getSelectedBufferRange()).toEqual [[3, 3], [3, 3]] + describe ".transact([fn])", -> + describe "when called without a function", -> + it "restores the selection when the transaction is undone/redone", -> + buffer.setText('1234') + editSession.setSelectedBufferRange([[0, 1], [0, 3]]) + editSession.transact() + + editSession.delete() + editSession.moveCursorToEndOfLine() + editSession.insertText('5') + expect(buffer.getText()).toBe '145' + + editSession.commit() + + editSession.undo() + expect(buffer.getText()).toBe '1234' + expect(editSession.getSelectedBufferRange()).toEqual [[0, 1], [0, 3]] + + editSession.redo() + expect(buffer.getText()).toBe '145' + expect(editSession.getSelectedBufferRange()).toEqual [[0, 3], [0, 3]] + describe "when the buffer is changed (via its direct api, rather than via than edit session)", -> it "moves the cursor so it is in the same relative position of the buffer", -> expect(editSession.getCursorScreenPosition()).toEqual [0, 0] diff --git a/src/app/buffer.coffee b/src/app/buffer.coffee index 2ea28802d..ca83bdf85 100644 --- a/src/app/buffer.coffee +++ b/src/app/buffer.coffee @@ -224,14 +224,11 @@ class Buffer else operation.do() - transact: (fn) -> - @undoManager.transact(fn) - - undo: (editSession) -> - @undoManager.undo(editSession) - - redo: (editSession) -> - @undoManager.redo(editSession) + transact: (fn) -> @undoManager.transact(fn) + undo: (editSession) -> @undoManager.undo(editSession) + redo: (editSession) -> @undoManager.redo(editSession) + commit: -> @undoManager.commit() + abort: -> @undoManager.abort() save: -> @saveAs(@getPath()) if @isModified() diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index 602c75aba..3f9835688 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -235,6 +235,27 @@ class EditSession redo: -> @buffer.redo(this) + transact: (fn) -> + isNewTransaction = @buffer.transact() + console.log isNewTransaction + oldSelectedRanges = @getSelectedBufferRanges() + @pushOperation + undo: (editSession) -> + editSession?.setSelectedBufferRanges(oldSelectedRanges) + if fn + fn() + @commit() if isNewTransaction + + commit: -> + newSelectedRanges = @getSelectedBufferRanges() + @pushOperation + redo: (editSession) -> + editSession?.setSelectedBufferRanges(newSelectedRanges) + @buffer.commit() + + abort: -> + @buffer.abort() + foldAll: -> @displayBuffer.foldAll() @@ -303,19 +324,6 @@ class EditSession mutateSelectedText: (fn) -> @transact => fn(selection) for selection in @getSelections() - transact: (fn) -> - @buffer.transact => - oldSelectedRanges = @getSelectedBufferRanges() - @pushOperation - undo: (editSession) -> - editSession?.setSelectedBufferRanges(oldSelectedRanges) - - fn() - newSelectedRanges = @getSelectedBufferRanges() - @pushOperation - redo: (editSession) -> - editSession?.setSelectedBufferRanges(newSelectedRanges) - pushOperation: (operation) -> @buffer.pushOperation(operation, this) diff --git a/src/app/undo-manager.coffee b/src/app/undo-manager.coffee index bded883b9..e910bc819 100644 --- a/src/app/undo-manager.coffee +++ b/src/app/undo-manager.coffee @@ -29,13 +29,14 @@ class UndoManager @clear() transact: (fn) -> - shouldCommit = not @currentTransaction? + isNewTransaction = not @currentTransaction? @currentTransaction ?= [] if fn try fn() finally - @commit() if shouldCommit + @commit() if isNewTransaction + isNewTransaction commit: -> @undoHistory.push(@currentTransaction) if @currentTransaction?.length