diff --git a/spec/app/language-mode-spec.coffee b/spec/app/language-mode-spec.coffee index 3eb11c901..035d1419b 100644 --- a/spec/app/language-mode-spec.coffee +++ b/spec/app/language-mode-spec.coffee @@ -145,6 +145,17 @@ 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\"'" + + editSession.buffer.setText('"aa"') + editSession.setCursorBufferPosition([0, 3]) + editSession.insertText "'" + expect(buffer.lineForRow(0)).toBe '"aa\'"' describe "javascript", -> beforeEach -> diff --git a/src/app/language-mode.coffee b/src/app/language-mode.coffee index 6c0b0e259..a99e1ff0e 100644 --- a/src/app/language-mode.coffee +++ b/src/app/language-mode.coffee @@ -23,7 +23,10 @@ class LanguageMode cursorBufferPosition = @editSession.getCursorBufferPosition() nextCharachter = @editSession.getTextInBufferRange([cursorBufferPosition, cursorBufferPosition.add([0,1])]) - autoCompleteOpeningBracket = @isOpeningBracket(text) and /\W|^$/.test(nextCharachter) + hasWordAfterCursor = /\w/.test(nextCharachter) + cursorInsideString = @tokenizedBuffer.isBufferPositionInsideString(cursorBufferPosition) + + autoCompleteOpeningBracket = @isOpeningBracket(text) and not hasWordAfterCursor and not cursorInsideString skipOverExistingClosingBracket = false if @isClosingBracket(text) and nextCharachter == text if bracketAnchorRange = @bracketAnchorRanges.filter((anchorRange) -> anchorRange.getBufferRange().end.isEqual(cursorBufferPosition))[0] diff --git a/src/app/tokenized-buffer.coffee b/src/app/tokenized-buffer.coffee index 0e73574b8..6b9dce69a 100644 --- a/src/app/tokenized-buffer.coffee +++ b/src/app/tokenized-buffer.coffee @@ -117,6 +117,10 @@ 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