diff --git a/lib/ace/edit_session.js b/lib/ace/edit_session.js index 9689ea5c..6c7f1c53 100644 --- a/lib/ace/edit_session.js +++ b/lib/ace/edit_session.js @@ -950,6 +950,9 @@ var EditSession = function(text, mode) { if (!$isPlaceholder) { + // experimental method, used by c9 findiniles + if (mode.attachToSession) + mode.attachToSession(this); this.$options.wrapMethod.set.call(this, this.$wrapMethod); this.$setFolding(mode.foldingRules); this.bgTokenizer.start(0); @@ -1731,9 +1734,10 @@ var EditSession = function(text, mode) { // Inside of the foldLine range. Need to split stuff up. if (cmp == 0) { foldLine = foldLine.split(start.row, start.column); - foldLine.shiftRow(len); - foldLine.addRemoveChars( - lastRow, 0, end.column - start.column); + if (foldLine) { + foldLine.shiftRow(len); + foldLine.addRemoveChars(lastRow, 0, end.column - start.column); + } } else // Infront of the foldLine but same row. Need to shift column. if (cmp == -1) { diff --git a/lib/ace/editor.js b/lib/ace/editor.js index 022653da..df0133ad 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -525,25 +525,23 @@ var Editor = function(renderer, session) { this.$highlightPending = true; setTimeout(function() { self.$highlightPending = false; - - var pos = self.session.findMatchingBracket(self.getCursorPosition()); + var session = self.session; + if (!session || !session.bgTokenizer) return; + var pos = session.findMatchingBracket(self.getCursorPosition()); if (pos) { - var range = new Range(pos.row, pos.column, pos.row, pos.column+1); - } else if (self.session.$mode.getMatching) { - var range = self.session.$mode.getMatching(self.session); + var range = new Range(pos.row, pos.column, pos.row, pos.column + 1); + } else if (session.$mode.getMatching) { + var range = session.$mode.getMatching(self.session); } if (range) - self.session.$bracketHighlight = self.session.addMarker(range, "ace_bracket", "text"); + session.$bracketHighlight = session.addMarker(range, "ace_bracket", "text"); }, 50); }; // todo: move to mode.getMatching this.$highlightTags = function() { - var session = this.session; - - if (this.$highlightTagPending) { + if (this.$highlightTagPending) return; - } // perform highlight async to not block the browser during navigation var self = this; @@ -551,6 +549,9 @@ var Editor = function(renderer, session) { setTimeout(function() { self.$highlightTagPending = false; + var session = self.session; + if (!session || !session.bgTokenizer) return; + var pos = self.getCursorPosition(); var iterator = new TokenIterator(self.session, pos.row, pos.column); var token = iterator.getCurrentToken(); @@ -2005,17 +2006,13 @@ var Editor = function(renderer, session) { * Moves the cursor's row and column to the next matching bracket or HTML tag. * **/ - this.jumpToMatching = function(select) { + this.jumpToMatching = function(select, expand) { var cursor = this.getCursorPosition(); var iterator = new TokenIterator(this.session, cursor.row, cursor.column); var prevToken = iterator.getCurrentToken(); - var token = prevToken; + var token = prevToken || iterator.stepForward(); - if (!token) - token = iterator.stepForward(); - - if (!token) - return; + if (!token) return; //get next closing tag or bracket var matchType; @@ -2034,12 +2031,12 @@ var Editor = function(renderer, session) { do { if (token.value.match(/[{}()\[\]]/g)) { - for (; i 1)) - var column = util.getRightNthChar(editor, cursor, param, 2); + column = util.getRightNthChar(editor, cursor, param, 2); if (typeof column === "number") { cursor.column += column + (isSel ? 1 : 0); @@ -444,8 +444,8 @@ module.exports = { var cursor = editor.getCursorPosition(); var column = util.getLeftNthChar(editor, cursor, param, count || 1); - if (isRepeat && column == 0 && !(count > 1)) - var column = util.getLeftNthChar(editor, cursor, param, 2); + if (isRepeat && column === 0 && !(count > 1)) + column = util.getLeftNthChar(editor, cursor, param, 2); if (typeof column === "number") { cursor.column -= column; @@ -558,7 +558,7 @@ module.exports = { content += "\n"; if (content.length) { - editor.navigateLineEnd() + editor.navigateLineEnd(); editor.insert(content); util.insertMode(editor); } @@ -575,7 +575,7 @@ module.exports = { if (content.length) { if(row > 0) { editor.navigateUp(); - editor.navigateLineEnd() + editor.navigateLineEnd(); editor.insert(content); } else { editor.session.insert({row: 0, column: 0}, content); diff --git a/lib/ace/lib/dom.js b/lib/ace/lib/dom.js index b3724009..65f20d7d 100644 --- a/lib/ace/lib/dom.js +++ b/lib/ace/lib/dom.js @@ -49,7 +49,7 @@ exports.createElement = function(tag, ns) { }; exports.hasCssClass = function(el, name) { - var classes = el.className.split(/\s+/g); + var classes = (el.className || "").split(/\s+/g); return classes.indexOf(name) !== -1; }; diff --git a/lib/ace/multi_select.js b/lib/ace/multi_select.js index ef0f7a2e..dd158010 100644 --- a/lib/ace/multi_select.js +++ b/lib/ace/multi_select.js @@ -720,7 +720,7 @@ var Editor = require("./editor").Editor; * @param {Boolean} skip If `true`, removes the active selection range * @method Editor.selectMore **/ - this.selectMore = function(dir, skip) { + this.selectMore = function(dir, skip, stopAtFirst) { var session = this.session; var sel = session.multiSelect; @@ -729,8 +729,8 @@ var Editor = require("./editor").Editor; range = session.getWordRange(range.start.row, range.start.column); range.cursor = dir == -1 ? range.start : range.end; this.multiSelect.addRange(range); - // todo add option for sublime like behavior - // return; + if (stopAtFirst) + return; } var needle = session.getTextRange(range); diff --git a/lib/ace/placeholder.js b/lib/ace/placeholder.js index bcb44ce2..582e2c2b 100644 --- a/lib/ace/placeholder.js +++ b/lib/ace/placeholder.js @@ -37,7 +37,6 @@ var oop = require("./lib/oop"); /** * @class PlaceHolder * - * **/ /** @@ -47,7 +46,6 @@ var oop = require("./lib/oop"); * - others (String): * - mainClass (String): * - othersClass (String): - * * * @constructor **/ @@ -93,6 +91,10 @@ var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) var doc = this.doc; var session = this.session; var pos = this.$pos; + + this.selectionBefore = session.selection.toJSON(); + if (session.selection.inMultiSelectMode) + session.selection.toSingleRange(); this.pos = doc.createAnchor(pos.row, pos.column); this.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false); @@ -218,9 +220,9 @@ var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) **/ this.onCursorChange = function(event) { - if (this.$updating) return; + if (this.$updating || !this.session) return; var pos = this.session.selection.getCursor(); - if(pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) { + if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) { this.showOtherMarkers(); this._emit("cursorEnter", event); } else { @@ -245,6 +247,7 @@ var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) this.others[i].detach(); } this.session.setUndoSelect(true); + this.session = null; }; /** @@ -261,6 +264,8 @@ var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) for (var i = 0; i < undosRequired; i++) { undoManager.undo(true); } + if (this.selectionBefore) + this.session.selection.fromJSON(this.selectionBefore); }; }).call(PlaceHolder.prototype); diff --git a/lib/ace/snippets.js b/lib/ace/snippets.js index 4fd301c2..10c34bf0 100644 --- a/lib/ace/snippets.js +++ b/lib/ace/snippets.js @@ -497,6 +497,10 @@ var SnippetManager = function() { var snippetMap = this.snippetMap; var snippetNameMap = this.snippetNameMap; var self = this; + + if (!snippets) + snippets = []; + function wrapRegexp(src) { if (src && !/^\^?\(.*\)\$?$|^\\b$/.test(src)) src = "(?:" + src + ")"; @@ -549,7 +553,7 @@ var SnippetManager = function() { s.endTriggerRe = new RegExp(s.endTrigger, "", true); } - if (snippets.content) + if (snippets && snippets.content) addSnippet(snippets); else if (Array.isArray(snippets)) snippets.forEach(addSnippet); diff --git a/lib/ace/virtual_renderer.js b/lib/ace/virtual_renderer.js index d3e26758..af49b52e 100644 --- a/lib/ace/virtual_renderer.js +++ b/lib/ace/virtual_renderer.js @@ -915,6 +915,8 @@ var VirtualRenderer = function(container, theme) { this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight); // this.$loop.changes = 0; this.desiredHeight = desiredHeight; + + this._signal("autosize"); } };