diff --git a/lib/ace/mode/behaviour/cstyle.js b/lib/ace/mode/behaviour/cstyle.js index 5f2e48b4..0efac142 100644 --- a/lib/ace/mode/behaviour/cstyle.js +++ b/lib/ace/mode/behaviour/cstyle.js @@ -33,14 +33,40 @@ define(function(require, exports, module) { var oop = require("../../lib/oop"); var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + + // Don't insert in the middle of a keyword/identifier/lexical + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", ["text"])) { + // Look ahead in case we're at the end of a token + iterator = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", ["text"])) + return false; + } + + // Don't insert in front of identifiers or brackets + iterator.stepForward(); + if (this.$matchTokenType(iterator.getCurrentToken() || "text", ["identifier", "paren.lparen"])) + return false; + return true; + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; this.add("braces", "insertion", function (state, action, editor, session, text) { if (text == '{') { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; var selection = editor.getSelectionRange(); var selected = session.doc.getTextRange(selection); - if (selected !== "" && selected !== "}") { + if (selected !== "" && selected !== "{") { return { text: '{' + selected + '}', selection: false @@ -98,9 +124,11 @@ var CstyleBehaviour = function () { this.add("parens", "insertion", function (state, action, editor, session, text) { if (text == '(') { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; var selection = editor.getSelectionRange(); var selected = session.doc.getTextRange(selection); - if (selected !== "" && selected !== ")") { + if (selected !== "") { return { text: '(' + selected + ')', selection: false @@ -141,9 +169,11 @@ var CstyleBehaviour = function () { this.add("brackets", "insertion", function (state, action, editor, session, text) { if (text == '[') { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; var selection = editor.getSelectionRange(); var selected = session.doc.getTextRange(selection); - if (selected !== "" && selected !== "]") { + if (selected !== "") { return { text: '[' + selected + ']', selection: false @@ -187,7 +217,7 @@ var CstyleBehaviour = function () { var quote = text; var selection = editor.getSelectionRange(); var selected = session.doc.getTextRange(selection); - if (selected !== "" && selected !== "'") { + if (selected !== "") { return { text: quote + selected + quote, selection: false