From 5c6e94ec7483bfda4801a6e56a8b51fc8c4e6d71 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 22 Jun 2012 12:07:20 -0600 Subject: [PATCH] Tab stops are associated with anchors so we can jump to them event when the buffer changes --- spec/extensions/snippets-spec.coffee | 7 ++++++- src/app/edit-session.coffee | 5 +++++ src/extensions/snippets/snippet.coffee | 9 +++++---- src/extensions/snippets/snippets.coffee | 9 +++++++-- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/spec/extensions/snippets-spec.coffee b/spec/extensions/snippets-spec.coffee index bc7fd71d7..f1c10caec 100644 --- a/spec/extensions/snippets-spec.coffee +++ b/spec/extensions/snippets-spec.coffee @@ -47,8 +47,13 @@ describe "Snippets extension", -> expect(buffer.lineForRow(1)).toBe "go here first:()" expect(buffer.lineForRow(2)).toBe "var quicksort = function () {" expect(editor.getCursorScreenPosition()).toEqual [1, 15] + editor.trigger keydownEvent('tab', target: editor[0]) expect(editor.getCursorScreenPosition()).toEqual [0, 14] + editor.insertText 'abc' + + editor.trigger keydownEvent('tab', target: editor[0]) + expect(editor.getCursorScreenPosition()).toEqual [0, 40] describe "when the letters preceding the cursor don't match a snippet", -> it "inserts a tab as normal", -> @@ -108,7 +113,7 @@ describe "Snippets extension", -> snippet = snippets['t1'] expect(snippet.body).toBe """ go here next:() and finally go here:() - go here first:()\n + go here first:() """ expect(snippet.tabStops).toEqual [[1, 15], [0, 14], [0, 37]] diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index db90fa96c..78f58b24d 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -239,6 +239,11 @@ class EditSession @anchors.push(anchor) anchor + addAnchorAtBufferPosition: (bufferPosition) -> + anchor = @addAnchor() + anchor.setBufferPosition(bufferPosition) + anchor + removeAnchor: (anchor) -> _.remove(@anchors, anchor) diff --git a/src/extensions/snippets/snippet.coffee b/src/extensions/snippets/snippet.coffee index 0e1c510d8..0ef9691eb 100644 --- a/src/extensions/snippets/snippet.coffee +++ b/src/extensions/snippets/snippet.coffee @@ -11,18 +11,19 @@ class Snippet bodyText = [] [row, column] = [0, 0] - for bodyLine in bodyLines + for bodyLine, i in bodyLines + lineText = [] for segment in bodyLine if _.isNumber(segment) tabStopsByIndex[segment] = new Point(row, column) else - bodyText.push(segment) + lineText.push(segment) column += segment.length - bodyText.push('\n') + bodyText.push(lineText.join('')) row++; column = 0 @tabStops = [] for index in _.keys(tabStopsByIndex).sort() @tabStops.push tabStopsByIndex[index] - bodyText.join('') + bodyText.join('\n') diff --git a/src/extensions/snippets/snippets.coffee b/src/extensions/snippets/snippets.coffee index 5c3776f6e..32102afaa 100644 --- a/src/extensions/snippets/snippets.coffee +++ b/src/extensions/snippets/snippets.coffee @@ -34,6 +34,7 @@ module.exports = class SnippetsSession + tabStopAnchors: null constructor: (@editSession, @snippetsByExtension) -> expandSnippet: -> @@ -43,15 +44,19 @@ class SnippetsSession @editSession.selectToBeginningOfWord() @activeSnippetStartPosition = @editSession.getCursorBufferPosition() @editSession.insertText(@activeSnippet.body) + @placeTabStopAnchors() @setTabStopIndex(0) if @activeSnippet.tabStops.length true else false + placeTabStopAnchors: -> + @tabStopAnchors = @activeSnippet.tabStops.map (position) => + @editSession.addAnchorAtBufferPosition(position) + goToNextTabStop: -> return false unless @activeSnippet @setTabStopIndex(@tabStopIndex + 1) setTabStopIndex: (@tabStopIndex) -> - tabStopPosition = @activeSnippet.tabStops[@tabStopIndex].subtract(@activeSnippetStartPosition) - @editSession.setCursorBufferPosition(tabStopPosition) + @editSession.setCursorBufferPosition(@tabStopAnchors[@tabStopIndex].getBufferPosition())