From 29f371b3474428413a5b938fb80bb8bbeb3721c2 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki & Nathan Sobo Date: Fri, 4 Jan 2013 12:44:44 -0700 Subject: [PATCH] Use `Editor.abort` to clear autocomplete's buffer changes on cancel Using this new `abort` mechanism ensures that autocomplete's changes can never be redone, while eliminating the need to track operation counts explicitly. --- src/app/editor.coffee | 3 +++ .../spec/autocomplete-spec.coffee | 13 +++++++++++++ .../autocomplete/src/autocomplete.coffee | 19 +++++++++---------- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/app/editor.coffee b/src/app/editor.coffee index 0fc9dfc44..bac155751 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -246,6 +246,9 @@ class Editor extends View paste: -> @activeEditSession.pasteText() undo: -> @activeEditSession.undo() redo: -> @activeEditSession.redo() + transact: (fn) -> @activeEditSession.transact(fn) + commit: -> @activeEditSession.commit() + abort: -> @activeEditSession.abort() createFold: (startRow, endRow) -> @activeEditSession.createFold(startRow, endRow) foldCurrentRow: -> @activeEditSession.foldCurrentRow() unfoldCurrentRow: -> @activeEditSession.unfoldCurrentRow() diff --git a/src/packages/autocomplete/spec/autocomplete-spec.coffee b/src/packages/autocomplete/spec/autocomplete-spec.coffee index a1db42385..9283e5b14 100644 --- a/src/packages/autocomplete/spec/autocomplete-spec.coffee +++ b/src/packages/autocomplete/spec/autocomplete-spec.coffee @@ -223,6 +223,19 @@ describe "Autocomplete", -> expect(editor.lineForBufferRow(10)).toBe "extra:S:extra" expect(editor.getCursorBufferPosition()).toEqual [10,7] + it "restores the original buffer contents even if there was an additional operation after autocomplete attached (regression)", -> + editor.getBuffer().insert([10,0] ,"extra:s:extra") + editor.setCursorBufferPosition([10,7]) + autocomplete.attach() + + editor.getBuffer().append('hi') + expect(editor.lineForBufferRow(10)).toBe "extra:sort:extra" + autocomplete.trigger 'core:cancel' + expect(editor.lineForBufferRow(10)).toBe "extra:s:extra" + + editor.redo() + expect(editor.lineForBufferRow(10)).toBe "extra:s:extra" + describe 'move-up event', -> it "highlights the previous match and replaces the selection with it", -> editor.getBuffer().insert([10,0] ,"extra:t:extra") diff --git a/src/packages/autocomplete/src/autocomplete.coffee b/src/packages/autocomplete/src/autocomplete.coffee index 14da00332..084fbbacd 100644 --- a/src/packages/autocomplete/src/autocomplete.coffee +++ b/src/packages/autocomplete/src/autocomplete.coffee @@ -17,7 +17,6 @@ class Autocomplete extends SelectList originalSelectionBufferRange: null originalCursorPosition: null aboveCursor: false - undoCount: 0 filterKey: 'word' initialize: (@editor) -> @@ -75,14 +74,15 @@ class Autocomplete extends SelectList @editor.setCursorBufferPosition([position.row, position.column + match.suffix.length]) cancelled: -> - @editor.undo() for undo in [0...@undoCount] + @editor.abort() @editor.setSelectedBufferRange(@originalSelectionBufferRange) @miniEditor.setText('') @editor.rootView()?.focus() if @miniEditor.isFocused attach: -> - @undoCount = 0 + @editor.transact() + @aboveCursor = false @originalSelectionBufferRange = @editor.getSelection().getBufferRange() @originalCursorPosition = @editor.getCursorScreenPosition() @@ -133,13 +133,12 @@ class Autocomplete extends SelectList selection = @editor.getSelection() startPosition = selection.getBufferRange().start buffer = @editor.getBuffer() - @editor.activeEditSession.transact => - selection.deleteSelectedText() - cursorPosition = @editor.getCursorBufferPosition() - buffer.delete(Range.fromPointWithDelta(cursorPosition, 0, match.suffix.length)) - buffer.delete(Range.fromPointWithDelta(cursorPosition, 0, -match.prefix.length)) - @editor.insertText(match.word) - @undoCount++ + + selection.deleteSelectedText() + cursorPosition = @editor.getCursorBufferPosition() + buffer.delete(Range.fromPointWithDelta(cursorPosition, 0, match.suffix.length)) + buffer.delete(Range.fromPointWithDelta(cursorPosition, 0, -match.prefix.length)) + @editor.insertText(match.word) infixLength = match.word.length - match.prefix.length - match.suffix.length @editor.setSelectedBufferRange([startPosition, [startPosition.row, startPosition.column + infixLength]])