From 6953b175a179e763d8a1659c0287be1ec531facc Mon Sep 17 00:00:00 2001 From: Lennart Kats Date: Wed, 24 Oct 2012 10:53:32 +0200 Subject: [PATCH 1/8] Don't insert quotes before text or around other quotes --- lib/ace/mode/behaviour/cstyle.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ace/mode/behaviour/cstyle.js b/lib/ace/mode/behaviour/cstyle.js index 346b5867..e05bc5b7 100644 --- a/lib/ace/mode/behaviour/cstyle.js +++ b/lib/ace/mode/behaviour/cstyle.js @@ -243,12 +243,12 @@ var CstyleBehaviour = function () { var quote = text; var selection = editor.getSelectionRange(); var selected = session.doc.getTextRange(selection); - if (selected !== "") { + if (selected !== "" && selected !== "'" && selected != '"') { return { text: quote + selected + quote, selection: false }; - } else { + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); var leftChar = line.substring(cursor.column-1, cursor.column); From 45d7c6a7ee342a0e81bf5efff99d88453d081268 Mon Sep 17 00:00:00 2001 From: Lennart Kats Date: Wed, 24 Oct 2012 14:59:09 +0200 Subject: [PATCH 2/8] Allow insertion before semmies --- lib/ace/mode/behaviour/cstyle.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/ace/mode/behaviour/cstyle.js b/lib/ace/mode/behaviour/cstyle.js index e05bc5b7..ab6fed23 100644 --- a/lib/ace/mode/behaviour/cstyle.js +++ b/lib/ace/mode/behaviour/cstyle.js @@ -56,6 +56,7 @@ var CstyleBehaviour = function () { // Only insert in front of whitespace/comments iterator.stepForward(); return iterator.getCurrentTokenRow() !== cursor.row || + (iterator.getCurrentToken() && iterator.getCurrentToken().value === ";") || this.$matchTokenType(iterator.getCurrentToken() || "text", ["text", "comment", "paren.rparen"]); }; From 67fe54834722c68c70f73a74c3cfa7302b53f750 Mon Sep 17 00:00:00 2001 From: Lennart Kats Date: Wed, 24 Oct 2012 15:23:24 +0200 Subject: [PATCH 3/8] Check for sane quote insertion at the latest possible point --- lib/ace/mode/behaviour/cstyle.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/ace/mode/behaviour/cstyle.js b/lib/ace/mode/behaviour/cstyle.js index ab6fed23..3781afe8 100644 --- a/lib/ace/mode/behaviour/cstyle.js +++ b/lib/ace/mode/behaviour/cstyle.js @@ -249,7 +249,7 @@ var CstyleBehaviour = function () { text: quote + selected + quote, selection: false }; - } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + } else { var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); var leftChar = line.substring(cursor.column-1, cursor.column); @@ -279,6 +279,8 @@ var CstyleBehaviour = function () { // Try and be smart about when we auto insert. if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; return { text: quote + quote, selection: [1,1] From b2ce75f95b0c301c2f1ad9c2f6a0623e350121fe Mon Sep 17 00:00:00 2001 From: Lennart Kats Date: Thu, 25 Oct 2012 13:28:42 +0200 Subject: [PATCH 4/8] Avoid getitng null token at end of line --- lib/ace/mode/behaviour/cstyle.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ace/mode/behaviour/cstyle.js b/lib/ace/mode/behaviour/cstyle.js index 3781afe8..51cac0f1 100644 --- a/lib/ace/mode/behaviour/cstyle.js +++ b/lib/ace/mode/behaviour/cstyle.js @@ -48,8 +48,8 @@ var CstyleBehaviour = function () { // Don't insert in the middle of a keyword/identifier/lexical if (!this.$matchTokenType(iterator.getCurrentToken() || "text", ["text", "paren.rparen"])) { // 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", "paren.rparen"])) + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", ["text", "paren.rparen"])) return false; } From ad28e3719ec932332a64e5d7ddac81b840cab063 Mon Sep 17 00:00:00 2001 From: Lennart Kats Date: Fri, 2 Nov 2012 13:33:27 +0100 Subject: [PATCH 5/8] Allow insertion before/in punctuation.operator; move rules to constants --- lib/ace/mode/behaviour/cstyle.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/ace/mode/behaviour/cstyle.js b/lib/ace/mode/behaviour/cstyle.js index 51cac0f1..f82abe54 100644 --- a/lib/ace/mode/behaviour/cstyle.js +++ b/lib/ace/mode/behaviour/cstyle.js @@ -35,6 +35,11 @@ var oop = require("../../lib/oop"); var Behaviour = require("../behaviour").Behaviour; var TokenIterator = require("../../token_iterator").TokenIterator; +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + var autoInsertedBrackets = 0; var autoInsertedRow = -1; var autoInsertedLineEnd = ""; @@ -46,18 +51,17 @@ var CstyleBehaviour = function () { 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", "paren.rparen"])) { + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { // Look ahead in case we're at the end of a token var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); - if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", ["text", "paren.rparen"])) + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) return false; } // Only insert in front of whitespace/comments iterator.stepForward(); return iterator.getCurrentTokenRow() !== cursor.row || - (iterator.getCurrentToken() && iterator.getCurrentToken().value === ";") || - this.$matchTokenType(iterator.getCurrentToken() || "text", ["text", "comment", "paren.rparen"]); + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); }; CstyleBehaviour.$matchTokenType = function(token, types) { From 99e45e012770510fdc71cac68c2f81d6f9417539 Mon Sep 17 00:00:00 2001 From: Lennart Kats Date: Sun, 11 Nov 2012 11:24:41 +0100 Subject: [PATCH 6/8] Don't insert a closing bracket for { until a newline is added --- lib/ace/edit_session/bracket_match.js | 4 +-- lib/ace/mode/behaviour/cstyle.js | 42 +++++++++++++++++++++++---- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/lib/ace/edit_session/bracket_match.js b/lib/ace/edit_session/bracket_match.js index d3e1d76d..e7a08056 100644 --- a/lib/ace/edit_session/bracket_match.js +++ b/lib/ace/edit_session/bracket_match.js @@ -37,10 +37,10 @@ var Range = require("../range").Range; function BracketMatch() { - this.findMatchingBracket = function(position) { + this.findMatchingBracket = function(position, char) { if (position.column == 0) return null; - var charBeforeCursor = this.getLine(position.row).charAt(position.column-1); + var charBeforeCursor = char || this.getLine(position.row).charAt(position.column-1); if (charBeforeCursor == "") return null; var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/); diff --git a/lib/ace/mode/behaviour/cstyle.js b/lib/ace/mode/behaviour/cstyle.js index f82abe54..e9ae064a 100644 --- a/lib/ace/mode/behaviour/cstyle.js +++ b/lib/ace/mode/behaviour/cstyle.js @@ -43,6 +43,10 @@ var SAFE_INSERT_BEFORE_TOKENS = var autoInsertedBrackets = 0; var autoInsertedRow = -1; var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineEnd = ""; +var maybeInserted = ""; var CstyleBehaviour = function () { @@ -79,6 +83,17 @@ var CstyleBehaviour = function () { autoInsertedBrackets++; }; + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line, maybeInsertedLineEnd[0])) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + maybeInserted = bracket + maybeInserted; + }; + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { return autoInsertedBrackets > 0 && cursor.row === autoInsertedRow && @@ -86,10 +101,21 @@ var CstyleBehaviour = function () { line.substr(cursor.column) === autoInsertedLineEnd; }; + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd; + }; + CstyleBehaviour.popAutoInsertedClosing = function() { autoInsertedLineEnd = autoInsertedLineEnd.substr(1); autoInsertedBrackets--; }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInserted = ""; + }; this.add("braces", "insertion", function (state, action, editor, session, text) { if (text == '{') { @@ -101,9 +127,9 @@ var CstyleBehaviour = function () { selection: false }; } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { - CstyleBehaviour.recordAutoInsert(editor, session, "}"); + CstyleBehaviour.recordMaybeInsert(editor, session, "}"); return { - text: '{}', + text: '{', selection: [1, 1] }; } @@ -124,9 +150,15 @@ var CstyleBehaviour = function () { } else if (text == "\n" || text == "\r\n") { var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + console.log("doit"); + closing = maybeInserted; + CstyleBehaviour.clearMaybeInsertedClosing(); + } var rightChar = line.substring(cursor.column, cursor.column + 1); - if (rightChar == '}') { - var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1}); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1}, '}'); if (!openBracePos) return null; @@ -134,7 +166,7 @@ var CstyleBehaviour = function () { var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row)); return { - text: '\n' + indent + '\n' + next_indent, + text: '\n' + indent + '\n' + next_indent + closing, selection: [1, indent.length, 1, indent.length] }; } From 05a3dce9d45db976fe0199f315468c0822d15b24 Mon Sep 17 00:00:00 2001 From: Lennart Kats Date: Mon, 12 Nov 2012 11:16:25 +0100 Subject: [PATCH 7/8] Insert a closing bracket for { inside other brackets, e.g. ({}) --- build | 2 +- lib/ace/mode/behaviour/cstyle.js | 47 +++++++++++++++++++------------- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/build b/build index 6149ca6b..86abb023 160000 --- a/build +++ b/build @@ -1 +1 @@ -Subproject commit 6149ca6b148e878d4c1341d4675ca3597d78dbdd +Subproject commit 86abb02339499ac96f95649ad5e088e66b6b9a9c diff --git a/lib/ace/mode/behaviour/cstyle.js b/lib/ace/mode/behaviour/cstyle.js index e9ae064a..99bb9f74 100644 --- a/lib/ace/mode/behaviour/cstyle.js +++ b/lib/ace/mode/behaviour/cstyle.js @@ -34,19 +34,21 @@ define(function(require, exports, module) { var oop = require("../../lib/oop"); var Behaviour = require("../behaviour").Behaviour; var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("ace/lib/lang"); var SAFE_INSERT_IN_TOKENS = ["text", "paren.rparen", "punctuation.operator"]; var SAFE_INSERT_BEFORE_TOKENS = ["text", "paren.rparen", "punctuation.operator", "comment"]; + var autoInsertedBrackets = 0; var autoInsertedRow = -1; var autoInsertedLineEnd = ""; var maybeInsertedBrackets = 0; var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; var maybeInsertedLineEnd = ""; -var maybeInserted = ""; var CstyleBehaviour = function () { @@ -86,12 +88,12 @@ var CstyleBehaviour = function () { CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); - if (!this.isMaybeInsertedClosing(cursor, line, maybeInsertedLineEnd[0])) + if (!this.isMaybeInsertedClosing(cursor, line)) maybeInsertedBrackets = 0; maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; maybeInsertedLineEnd = line.substr(cursor.column); maybeInsertedBrackets++; - maybeInserted = bracket + maybeInserted; }; CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { @@ -104,7 +106,8 @@ var CstyleBehaviour = function () { CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { return maybeInsertedBrackets > 0 && cursor.row === maybeInsertedRow && - line.substr(cursor.column) === maybeInsertedLineEnd; + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; }; CstyleBehaviour.popAutoInsertedClosing = function() { @@ -114,10 +117,12 @@ var CstyleBehaviour = function () { CstyleBehaviour.clearMaybeInsertedClosing = function() { maybeInsertedBrackets = 0; - maybeInserted = ""; + maybeInsertedRow = -1; }; this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); if (text == '{') { var selection = editor.getSelectionRange(); var selected = session.doc.getTextRange(selection); @@ -127,15 +132,20 @@ var CstyleBehaviour = function () { selection: false }; } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { - CstyleBehaviour.recordMaybeInsert(editor, session, "}"); - return { - text: '{', - selection: [1, 1] - }; + if (/[\]\}\)]/.test(line[cursor.column])) { + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } } } else if (text == '}') { - var cursor = editor.getCursorPosition(); - var line = session.doc.getLine(cursor.row); var rightChar = line.substring(cursor.column, cursor.column + 1); if (rightChar == '}') { var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); @@ -148,22 +158,19 @@ var CstyleBehaviour = function () { } } } else if (text == "\n" || text == "\r\n") { - var cursor = editor.getCursorPosition(); - var line = session.doc.getLine(cursor.row); var closing = ""; if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { - console.log("doit"); - closing = maybeInserted; + closing = lang.stringRepeat("}", maybeInsertedBrackets); CstyleBehaviour.clearMaybeInsertedClosing(); } var rightChar = line.substring(cursor.column, cursor.column + 1); if (rightChar == '}' || closing !== "") { - var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1}, '}'); + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); if (!openBracePos) return null; - var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString()); - var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row)); + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); return { text: '\n' + indent + '\n' + next_indent + closing, @@ -181,6 +188,8 @@ var CstyleBehaviour = function () { if (rightChar == '}') { range.end.column++; return range; + } else { + maybeInsertedBrackets--; } } }); From 71808b1a405e76400796c37838e855baaafeff16 Mon Sep 17 00:00:00 2001 From: Lennart Kats Date: Mon, 12 Nov 2012 15:07:53 +0100 Subject: [PATCH 8/8] Fix relative path, insert recording --- lib/ace/mode/behaviour/cstyle.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/ace/mode/behaviour/cstyle.js b/lib/ace/mode/behaviour/cstyle.js index 99bb9f74..f90ce634 100644 --- a/lib/ace/mode/behaviour/cstyle.js +++ b/lib/ace/mode/behaviour/cstyle.js @@ -34,7 +34,7 @@ define(function(require, exports, module) { var oop = require("../../lib/oop"); var Behaviour = require("../behaviour").Behaviour; var TokenIterator = require("../../token_iterator").TokenIterator; -var lang = require("ace/lib/lang"); +var lang = require("../../lib/lang"); var SAFE_INSERT_IN_TOKENS = ["text", "paren.rparen", "punctuation.operator"]; @@ -133,6 +133,7 @@ var CstyleBehaviour = function () { }; } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); return { text: '{}', selection: [1, 1]