From 40673549cb39b86da106fc5eca50e4bc8e6b8030 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 29 Oct 2012 13:12:16 -0700 Subject: [PATCH] Quotes only automatically close if they are opened after a non-word character. --- spec/app/language-mode-spec.coffee | 37 ++++++++++++++++++++++-------- src/app/language-mode.coffee | 8 +++++-- src/app/tokenized-buffer.coffee | 4 ---- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/spec/app/language-mode-spec.coffee b/spec/app/language-mode-spec.coffee index 035d1419b..5fbba5e58 100644 --- a/spec/app/language-mode-spec.coffee +++ b/spec/app/language-mode-spec.coffee @@ -145,17 +145,34 @@ describe "LanguageMode", -> expect(buffer.lineForRow(0)).toBe '"ok"' expect(editSession.getCursorBufferPosition()).toEqual [0, 4] - describe "when the cursor is inside a string", -> - it "does not automatically insert closing single or double quote", -> - editSession.buffer.setText("'aa'") - editSession.setCursorBufferPosition([0, 3]) - editSession.insertText '"' - expect(buffer.lineForRow(0)).toBe "'aa\"'" + describe "when inserting a quote", -> + describe "when a word charachter is before the cursor", -> + it "does not automatically insert closing quote", -> + editSession.buffer.setText("abc") + editSession.setCursorBufferPosition([0, 3]) + editSession.insertText '"' + expect(buffer.lineForRow(0)).toBe "abc\"" - editSession.buffer.setText('"aa"') - editSession.setCursorBufferPosition([0, 3]) - editSession.insertText "'" - expect(buffer.lineForRow(0)).toBe '"aa\'"' + editSession.buffer.setText("abc") + editSession.setCursorBufferPosition([0, 3]) + editSession.insertText '\'' + expect(buffer.lineForRow(0)).toBe "abc\'" + + describe "when a non word charachter is before the cursor", -> + it "automatically insert closing quote", -> + editSession.buffer.setText("ab@") + editSession.setCursorBufferPosition([0, 3]) + editSession.insertText '"' + expect(buffer.lineForRow(0)).toBe "ab@\"\"" + expect(editSession.getCursorBufferPosition()).toEqual [0, 4] + + describe "when the cursor is on an empty line", -> + it "automatically insert closing quote", -> + editSession.buffer.setText("") + editSession.setCursorBufferPosition([0, 0]) + editSession.insertText '"' + expect(buffer.lineForRow(0)).toBe "\"\"" + expect(editSession.getCursorBufferPosition()).toEqual [0, 1] describe "javascript", -> beforeEach -> diff --git a/src/app/language-mode.coffee b/src/app/language-mode.coffee index eae7a3f0f..46fd54b48 100644 --- a/src/app/language-mode.coffee +++ b/src/app/language-mode.coffee @@ -24,12 +24,13 @@ class LanguageMode return true if @editSession.hasMultipleCursors() cursorBufferPosition = @editSession.getCursorBufferPosition() + previousCharachter = @editSession.getTextInBufferRange([cursorBufferPosition.add([0, -1]), cursorBufferPosition]) nextCharachter = @editSession.getTextInBufferRange([cursorBufferPosition, cursorBufferPosition.add([0,1])]) hasWordAfterCursor = /\w/.test(nextCharachter) - cursorInsideString = @getTokenizedBuffer().isBufferPositionInsideString(cursorBufferPosition) + hasWordBeforeCursor = /\w/.test(previousCharachter) - autoCompleteOpeningBracket = @isOpeningBracket(text) and not hasWordAfterCursor and not cursorInsideString + autoCompleteOpeningBracket = @isOpeningBracket(text) and not hasWordAfterCursor and not (@isQuote(text) and hasWordBeforeCursor) skipOverExistingClosingBracket = false if @isClosingBracket(text) and nextCharachter == text if bracketAnchorRange = @bracketAnchorRanges.filter((anchorRange) -> anchorRange.getBufferRange().end.isEqual(cursorBufferPosition))[0] @@ -50,6 +51,9 @@ class LanguageMode getTokenizedBuffer: -> @editSession.tokenizedBuffer + isQuote: (string) -> + /'|"/.test(string) + isOpeningBracket: (string) -> @pairedCharacters[string]? diff --git a/src/app/tokenized-buffer.coffee b/src/app/tokenized-buffer.coffee index 6ba17449b..a57bff2f2 100644 --- a/src/app/tokenized-buffer.coffee +++ b/src/app/tokenized-buffer.coffee @@ -116,10 +116,6 @@ class TokenizedBuffer iterator(token, startOfToken, { stop }) if bufferRange.containsPoint(startOfToken) return unless keepLooping - isBufferPositionInsideString: (bufferPosition) -> - if lastScope = _.last(@scopesForPosition(bufferPosition)) - /^string\./.test(lastScope) - findOpeningBracket: (startBufferPosition) -> range = [[0,0], startBufferPosition] position = null