diff --git a/spec/app/display-buffer-spec.coffee b/spec/app/display-buffer-spec.coffee index 377a3f4f3..14c46f6f3 100644 --- a/spec/app/display-buffer-spec.coffee +++ b/spec/app/display-buffer-spec.coffee @@ -16,6 +16,28 @@ describe "DisplayBuffer", -> displayBuffer.destroy() buffer.release() + describe ".copy()", -> + it "creates a new DisplayBuffer with the same initial state", -> + marker1 = displayBuffer.markBufferRange([[1, 2], [3, 4]], id: 1) + marker2 = displayBuffer.markBufferRange([[2, 3], [4, 5]], isReversed: true, id: 2) + marker3 = displayBuffer.markBufferPosition([5, 6], id: 3) + displayBuffer.createFold(3, 5) + + displayBuffer2 = displayBuffer.copy() + expect(displayBuffer2.id).not.toBe displayBuffer.id + expect(displayBuffer2.buffer).toBe displayBuffer.buffer + expect(displayBuffer2.getTabLength()).toBe displayBuffer.getTabLength() + + expect(displayBuffer2.getMarkerCount()).toEqual displayBuffer.getMarkerCount() + expect(displayBuffer2.findMarker(id: 1)).toEqual marker1 + expect(displayBuffer2.findMarker(id: 2)).toEqual marker2 + expect(displayBuffer2.findMarker(id: 3)).toEqual marker3 + expect(displayBuffer2.isFoldedAtBufferRow(3)).toBeTruthy() + + # can diverge from origin + displayBuffer2.destroyFoldsContainingBufferRow(3) + expect(displayBuffer2.isFoldedAtBufferRow(3)).not.toBe displayBuffer.isFoldedAtBufferRow(3) + describe "when the buffer changes", -> it "renders line numbers correctly", -> originalLineCount = displayBuffer.getLineCount() diff --git a/src/app/display-buffer-marker.coffee b/src/app/display-buffer-marker.coffee index a46c1ec5e..9c4142a49 100644 --- a/src/app/display-buffer-marker.coffee +++ b/src/app/display-buffer-marker.coffee @@ -154,10 +154,7 @@ class DisplayBufferMarker isEqual: (other) -> return false unless other instanceof @constructor - @getBufferRange().isEqual(other.getBufferRange()) and - @isReversed() is other.isReversed() and - @hasTail() is other.hasTail() and - _.isEqual(@getAttributes(), other.getAttributes()) + @bufferMarker.isEqual(other.bufferMarker) # Returns a {String} representation of the marker inspect: -> diff --git a/src/app/display-buffer.coffee b/src/app/display-buffer.coffee index 8933bb740..53c398e26 100644 --- a/src/app/display-buffer.coffee +++ b/src/app/display-buffer.coffee @@ -1,8 +1,9 @@ _ = require 'underscore' +guid = require 'guid' +{Point, Range} = require 'telepath' TokenizedBuffer = require 'tokenized-buffer' RowMap = require 'row-map' EventEmitter = require 'event-emitter' -{Point, Range} = require 'telepath' Fold = require 'fold' Token = require 'token' DisplayBufferMarker = require 'display-buffer-marker' @@ -20,7 +21,7 @@ class DisplayBuffer ### Internal ### constructor: (@buffer, options={}) -> - @id = @constructor.idCounter++ + @id = guid.create().toString() @tokenizedBuffer = new TokenizedBuffer(@buffer, options) @softWrapColumn = options.softWrapColumn ? Infinity @markers = {} @@ -32,6 +33,11 @@ class DisplayBuffer @subscribe @buffer, 'markers-updated', @handleMarkersUpdated @subscribe @buffer, 'marker-created', @handleMarkerCreated + copy: -> + newDisplayBuffer = new DisplayBuffer(@buffer, tabLength: @getTabLength()) + @findMarkers(displayBufferId: @id).map (marker) -> marker.copy(displayBufferId: newDisplayBuffer.id) + newDisplayBuffer + updateAllScreenLines: -> @maxLineLength = 0 @screenLines = [] @@ -109,6 +115,12 @@ class DisplayBuffer @buffer.markRange([[startRow, 0], [endRow, Infinity]], @foldMarkerAttributes()) @foldForMarker(foldMarker) + isFoldedAtBufferRow: (bufferRow) -> + @largestFoldContainingBufferRow(bufferRow)? + + isFoldedAtScreenRow: (screenRow) -> + @largestFoldContainingBufferRow(@bufferRowForScreenRow(screenRow))? + # Destroys the fold with the given id destroyFoldWithId: (id) -> @foldsByMarkerId[id]?.destroy() @@ -405,6 +417,9 @@ class DisplayBuffer getMarkers: -> @buffer.getMarkers().map ({id}) => @getMarker(id) + getMarkerCount: -> + @buffer.getMarkerCount() + # Constructs a new marker at the given screen range. # # range - The marker {Range} (representing the distance between the head and tail) diff --git a/vendor/telepath b/vendor/telepath index 8cc54e703..c12246df2 160000 --- a/vendor/telepath +++ b/vendor/telepath @@ -1 +1 @@ -Subproject commit 8cc54e7038a474e3c24940f4895e62b278de8a26 +Subproject commit c12246df2efe961409ded4ccb12a0d7b42672944