diff --git a/spec/display-buffer-spec.coffee b/spec/display-buffer-spec.coffee index 4a0314483..267fe01c9 100644 --- a/spec/display-buffer-spec.coffee +++ b/spec/display-buffer-spec.coffee @@ -47,6 +47,15 @@ describe "DisplayBuffer", -> buffer.insert([0,0], oneHundredLines) expect(displayBuffer.getLineCount()).toBe 100 + originalLineCount + it "reassigns the scrollTop if it exceeds the max possible value after lines are removed", -> + displayBuffer.manageScrollPosition = true + displayBuffer.setHeight(50) + displayBuffer.setLineHeightInPixels(10) + displayBuffer.setScrollTop(80) + + buffer.delete([[8, 0], [10, 0]]) + expect(displayBuffer.getScrollTop()).toBe 60 + describe "soft wrapping", -> beforeEach -> displayBuffer.setSoftWrap(true) diff --git a/src/display-buffer.coffee b/src/display-buffer.coffee index 23b288eac..7c01b5a2d 100644 --- a/src/display-buffer.coffee +++ b/src/display-buffer.coffee @@ -182,10 +182,13 @@ class DisplayBuffer extends Model getScrollTop: -> @scrollTop setScrollTop: (scrollTop) -> if @manageScrollPosition - @scrollTop = Math.round(Math.max(0, Math.min(@getScrollHeight() - @getClientHeight(), scrollTop))) + @scrollTop = Math.round(Math.max(0, Math.min(@getMaxScrollTop(), scrollTop))) else @scrollTop = Math.round(scrollTop) + getMaxScrollTop: -> + @getScrollHeight() - @getClientHeight() + getScrollBottom: -> @scrollTop + @height setScrollBottom: (scrollBottom) -> @setScrollTop(scrollBottom - @getClientHeight()) @@ -981,6 +984,7 @@ class DisplayBuffer extends Model handleTokenizedBufferChange: (tokenizedBufferChange) => {start, end, delta, bufferChange} = tokenizedBufferChange @updateScreenLines(start, end + 1, delta, delayChangeEvent: bufferChange?) + @setScrollTop(Math.min(@getScrollTop(), @getMaxScrollTop())) if delta < 0 updateScreenLines: (startBufferRow, endBufferRow, bufferDelta=0, options={}) -> startBufferRow = @rowMap.bufferRowRangeForBufferRow(startBufferRow)[0]