From d042d15a5097ed4ae6672c9730ef2b4dc7a835ca Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 7 Jul 2014 15:21:48 -0600 Subject: [PATCH] Autoscroll to cursor on undo Fixes #2815 This commit changes our autoscroll strategy for cursors significantly. Originally, we were autoscrolling whenever the cursor's marker changed positions. This worked well, except we didn't end up autoscrolling when the user *attempted* to move the cursor to an invalid position, such as moving down at the end of the buffer, due to the fact that the marker wouldn't change. Then, we moved to always requesting an autoscroll whenever a position change was requested via Cursor::changePosition. This missed out on moving the cursor when inserting text, so we then also added an explicit autoscroll call when inserting text. This had the problem of not autoscrolling due to undo. So finally, this solution combines explicit autoscroll in ::changePosition to capture intent, as well as implicit autoscrolling whenever the cursor's marker position changes due to a textual change in the buffer. This captures undo/redo correctly. --- spec/editor-spec.coffee | 6 ++++++ src/cursor.coffee | 1 + src/selection.coffee | 2 -- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/spec/editor-spec.coffee b/spec/editor-spec.coffee index 290710df7..f6b4b78dd 100644 --- a/spec/editor-spec.coffee +++ b/spec/editor-spec.coffee @@ -792,6 +792,12 @@ describe "Editor", -> editor.insertNewline() expect(editor.getScrollBottom()).toBe 15 * 10 + it "autoscrolls to the cursor when it moves due to undo", -> + editor.insertText('abc') + editor.setScrollTop(Infinity) + editor.undo() + expect(editor.getScrollTop()).toBe 0 + describe "selection", -> selection = null diff --git a/src/cursor.coffee b/src/cursor.coffee index 7ab62ae81..58bf31395 100644 --- a/src/cursor.coffee +++ b/src/cursor.coffee @@ -28,6 +28,7 @@ class Cursor extends Model # Supports old editor view @needsAutoscroll ?= @isLastCursor() and !textChanged + @autoscroll() if @editor.manageScrollPosition and @isLastCursor() and textChanged @goalColumn = null diff --git a/src/selection.coffee b/src/selection.coffee index 93bebbe7c..c34374299 100644 --- a/src/selection.coffee +++ b/src/selection.coffee @@ -326,8 +326,6 @@ class Selection extends Model newBufferRange = @editor.buffer.setTextInRange(oldBufferRange, text, pick(options, 'undo')) - @cursor.autoscroll() if @editor.manageScrollPosition and @cursor.isLastCursor() - if options.select @setBufferRange(newBufferRange, reversed: wasReversed) else