Be selective when auto-inserting brackets

This commit is contained in:
Lennart Kats 2012-10-18 14:41:35 +02:00
commit 5ed0998ce7

View file

@ -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