diff --git a/lib/ace/css/editor.css b/lib/ace/css/editor.css
index 0d596052..83c21130 100644
--- a/lib/ace/css/editor.css
+++ b/lib/ace/css/editor.css
@@ -151,6 +151,10 @@
opacity: 0.2;
}
+.ace_editor.multiselect .ace_cursor {
+ border-left-width: 1px;
+}
+
.ace_line {
white-space: nowrap;
}
diff --git a/lib/ace/editor.js b/lib/ace/editor.js
index d7a5966e..0e1df71b 100644
--- a/lib/ace/editor.js
+++ b/lib/ace/editor.js
@@ -1163,11 +1163,12 @@ var Editor = function(renderer, session) {
if (!ranges.length)
return replaced;
+ this.$blockScrolling += 1;
+
var selection = this.getSelectionRange();
this.clearSelection();
this.selection.moveCursorTo(0, 0);
- this.$blockScrolling += 1;
for (var i = ranges.length - 1; i >= 0; --i) {
if(this.$tryReplace(ranges[i], replacement)) {
replaced++;
diff --git a/lib/ace/layer/cursor.js b/lib/ace/layer/cursor.js
index 36a085f3..1c55d7a8 100644
--- a/lib/ace/layer/cursor.js
+++ b/lib/ace/layer/cursor.js
@@ -107,11 +107,11 @@ var Cursor = function(parentEl) {
if (!this.isVisible)
return;
- var element = this.element;
+ var element = this.cursors.length == 1 ? this.cursor : this.element;
this.blinkId = setInterval(function() {
element.style.visibility = "hidden";
setTimeout(function() {
- element.style.visibility = "visible";
+ element.style.visibility = "";
}, 400);
}, 1000);
};
@@ -141,7 +141,7 @@ var Cursor = function(parentEl) {
this.update = function(config) {
this.config = config;
- if (this.session.selectionMarkerCount > 1) {
+ if (this.session.selectionMarkerCount > 0) {
var selections = this.session.$selectionMarkers;
var i = 0, sel, cursorIndex = 0;
diff --git a/lib/ace/layer/marker.js b/lib/ace/layer/marker.js
index ac361249..741a271d 100644
--- a/lib/ace/layer/marker.js
+++ b/lib/ace/layer/marker.js
@@ -99,7 +99,7 @@ var Marker = function(parentEl) {
}
else {
this.drawSingleLineMarker(
- html, range, marker.clazz, config,
+ html, range, marker.clazz + " start", config,
null, marker.type
);
}
@@ -122,7 +122,7 @@ var Marker = function(parentEl) {
row, range.start.column,
row, this.session.getScreenLastRowColumn(row)
);
- this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 1, "text");
+ this.drawSingleLineMarker(stringBuilder, lineRange, clazz + " start", layerConfig, 1, "text");
// selection end
row = range.end.row;
@@ -152,7 +152,7 @@ var Marker = function(parentEl) {
);
stringBuilder.push(
- "
+ * Javier Perez-Griffo
+ * James Tan
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
@@ -47,14 +49,20 @@ var ShHighlightRules = function() {
var reservedKeywords = lang.arrayToMap(
('!|{|}|case|do|done|elif|else|'+
'esac|fi|for|if|in|then|until|while|'+
- '&|;'
+ '&|;|export|local|read|typeset|unset|'+
+ 'elif|select|set'
).split('|')
);
var languageConstructs = lang.arrayToMap(
- // TODO
- ('echo|exit|eval|source|[|]|test|'+
- 'true|false|read'
+ ('[|]|alias|bg|bind|break|builtin|'+
+ 'cd|command|compgen|complete|continue|'+
+ 'dirs|disown|echo|enable|eval|exec|'+
+ 'exit|fc|fg|getopts|hash|help|history|'+
+ 'jobs|kill|let|logout|popd|printf|pushd|'+
+ 'pwd|return|set|shift|shopt|source|'+
+ 'suspend|test|times|trap|type|ulimit|'+
+ 'umask|unalias|wait'
).split('|')
);
diff --git a/lib/ace/mode/text_highlight_rules.js b/lib/ace/mode/text_highlight_rules.js
index 862035d6..4af6cb20 100644
--- a/lib/ace/mode/text_highlight_rules.js
+++ b/lib/ace/mode/text_highlight_rules.js
@@ -65,8 +65,6 @@ var TextHighlightRules = function() {
var rule = state[i];
if (rule.next) {
rule.next = prefix + rule.next;
- } else {
- rule.next = prefix + key;
}
}
this.$rules[prefix + key] = state;
diff --git a/lib/ace/mouse/multi_select_handler.js b/lib/ace/mouse/multi_select_handler.js
index fa5def23..24b25cd4 100644
--- a/lib/ace/mouse/multi_select_handler.js
+++ b/lib/ace/mouse/multi_select_handler.js
@@ -111,9 +111,10 @@ function onMouseDown(e) {
if (!isMultiSelect && inSelection)
return; // dragging
- if (!isMultiSelect)
- selection.addRange(selection.toOrientedRange());
-
+ if (!isMultiSelect) {
+ var range = selection.toOrientedRange();
+ editor.addSelectionMarker(range);
+ }
var oldRange = selection.rangeList.rangeAtPoint(pos);
@@ -122,8 +123,13 @@ function onMouseDown(e) {
if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor))
selection.substractPoint(tmpSel.cursor);
- else
+ else {
+ if (range) {
+ editor.removeSelectionMarker(range);
+ selection.addRange(range);
+ }
selection.addRange(tmpSel);
+ }
});
} else if (!shift && alt && button == 0) {
diff --git a/lib/ace/multi_select.js b/lib/ace/multi_select.js
index 716bc0fc..0b8850bc 100644
--- a/lib/ace/multi_select.js
+++ b/lib/ace/multi_select.js
@@ -76,18 +76,19 @@ var EditSession = require("./edit_session").EditSession;
*
* adds a range to selection entering multiselect mode if necessary
**/
- this.addRange = function(range) {
- if (!this.inMultiSelectMode && this.rangeCount == 0) {
- var oldRange = this.toOrientedRange();
- if (!range || !range.isEqual(oldRange)) {
- this.rangeList.add(oldRange);
- this.$onAddRange(oldRange);
- }
- }
-
+ this.addRange = function(range, $blockChangeEvents) {
if (!range)
return;
+ if (!this.inMultiSelectMode && this.rangeCount == 0) {
+ var oldRange = this.toOrientedRange();
+ if (range.intersects(oldRange))
+ return $blockChangeEvents || this.fromOrientedRange(range);
+
+ this.rangeList.add(oldRange);
+ this.$onAddRange(oldRange);
+ }
+
if (!range.cursor)
range.cursor = range.end;
@@ -98,12 +99,14 @@ var EditSession = require("./edit_session").EditSession;
if (removed.length)
this.$onRemoveRange(removed);
- if (this.rangeCount > 0 && !this.inMultiSelectMode) {
+ if (this.rangeCount > 1 && !this.inMultiSelectMode) {
this._emit("multiSelect");
this.inMultiSelectMode = true;
this.session.$undoSelect = false;
this.rangeList.attach(this.session);
}
+
+ return $blockChangeEvents || this.fromOrientedRange(range);
};
this.toSingleRange = function(range) {
@@ -145,7 +148,6 @@ var EditSession = require("./edit_session").EditSession;
this.$onAddRange = function(range) {
this.rangeCount = this.rangeList.ranges.length;
this.ranges.unshift(range);
- this.fromOrientedRange(range);
this._emit("addRange", {range: range});
};
@@ -309,17 +311,34 @@ var Editor = require("./editor").Editor;
return orientedRange;
};
+ /**
+ * Editor.removeSelectionMarker(range) -> Void
+ * - range: selection range added with addSelectionMarker
+ *
+ * removes selection marker
+ **/
+ this.removeSelectionMarker = function(range) {
+ if (!range.marker)
+ return;
+ this.session.removeMarker(range.marker);
+ var index = this.session.$selectionMarkers.indexOf(range);
+ if (index != -1)
+ this.session.$selectionMarkers.splice(index, 1);
+ this.session.selectionMarkerCount = this.session.$selectionMarkers.length;
+ };
+
this.removeSelectionMarkers = function(ranges) {
+ var markerList = this.session.$selectionMarkers;
for (var i = ranges.length; i--; ) {
var range = ranges[i];
if (!range.marker)
continue;
this.session.removeMarker(range.marker);
- var index = this.session.$selectionMarkers.indexOf(range);
+ var index = markerList.indexOf(range);
if (index != -1)
- this.session.$selectionMarkers.splice(index, 1);
+ markerList.splice(index, 1);
}
- this.session.selectionMarkerCount = this.session.$selectionMarkers.length;
+ this.session.selectionMarkerCount = markerList.length;
};
this.$onAddRange = function(e) {
@@ -442,6 +461,37 @@ var Editor = require("./editor").Editor;
return text;
};
+ /**
+ * Editor.findAll(dir, options) -> Number
+ * - needle: text to find
+ * - options: search options
+ * - additive: keeps
+ *
+ * finds and selects all the occurencies of needle
+ * returns number of found ranges
+ **/
+ this.findAll = function(needle, options, additive) {
+ options = options || {};
+ options.needle = needle || options.needle;
+ this.$search.set(options);
+
+ var ranges = this.$search.findAll(this.session);
+ if (!ranges.length)
+ return 0;
+
+ this.$blockScrolling += 1;
+ var selection = this.multiSelect;
+
+ if (!additive)
+ selection.toSingleRange(ranges[0]);
+
+ for (var i = ranges.length; i--; )
+ selection.addRange(ranges[i], true);
+
+ this.$blockScrolling -= 1;
+
+ return ranges.length;
+ };
// commands
/**
@@ -623,6 +673,33 @@ function MultiSelect(editor) {
editor.on("mousedown", onMouseDown);
editor.commands.addCommands(exports.commands.defaultCommands);
+
+ addAltCursorListeners(editor);
+}
+
+function addAltCursorListeners(editor){
+ var el = editor.textInput.getElement();
+ var altCursor = false;
+ var contentEl = editor.renderer.content;
+ el.addEventListener("keydown", function(e) {
+ if (e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey)) {
+ if (!altCursor) {
+ contentEl.style.cursor = "crosshair";
+ altCursor = true;
+ }
+ } else if (altCursor) {
+ contentEl.style.cursor = "";
+ }
+ });
+
+ el.addEventListener("keyup", reset);
+ el.addEventListener("blur", reset);
+ function reset() {
+ if (altCursor) {
+ contentEl.style.cursor = "";
+ altCursor = false;
+ }
+ }
}
exports.MultiSelect = MultiSelect;
diff --git a/lib/ace/multi_select_test.js b/lib/ace/multi_select_test.js
index 571202f0..8e0a4013 100644
--- a/lib/ace/multi_select_test.js
+++ b/lib/ace/multi_select_test.js
@@ -57,7 +57,7 @@ var exec = function(name, times, args) {
} while(times --> 1)
};
var testRanges = function(str) {
- assert.equal(editor.selection.getAllRanges()+"", str);
+ assert.equal(editor.selection.getAllRanges() + "", str + "");
}
module.exports = {
@@ -78,8 +78,8 @@ module.exports = {
assert.ok(editor.inMultiSelectMode);
assert.equal(editor.selection.getAllRanges().length, 4);
- var newLine = editor.session.getDocument().getNewLineCharacter();
- var copyText = "wwww".split("").join(newLine);
+ var newLine = editor.session.getDocument().getNewLineCharacter();
+ var copyText = "wwww".split("").join(newLine);
assert.equal(editor.getCopyText(), copyText);
exec("insertstring", 1, "a");
exec("backspace", 2);
@@ -120,14 +120,11 @@ module.exports = {
" wtt.w",
" wtt.w"
]);
- var editor = new Editor(new MockRenderer(), doc);
+ editor = new Editor(new MockRenderer(), doc);
MultiSelect(editor);
editor.selectMoreLines(1)
- assert.equal(
- editor.selection.getAllRanges()+"",
- "Range: [0/0] -> [0/0],Range: [1/0] -> [1/0]"
- );
+ testRanges("Range: [0/0] -> [0/0],Range: [1/0] -> [1/0]");
assert.ok(editor.inMultiSelectMode);
var doc2 = new EditSession(["w1"]);
@@ -136,6 +133,34 @@ module.exports = {
editor.setSession(doc);
assert.ok(editor.inMultiSelectMode);
+ },
+
+ "test: multiselect addRange": function() {
+ var doc = new EditSession([
+ "w1.w2",
+ " wtt.w",
+ " wtt.w"
+ ]);
+ editor = new Editor(new MockRenderer(), doc);
+ MultiSelect(editor);
+ var selection = editor.selection;
+
+ var range1 = new Range(0, 2, 0, 4);
+ editor.selection.fromOrientedRange(range1);
+
+ var range2 = new Range(0, 3, 0, 4);
+ selection.addRange(range2);
+ assert.ok(!editor.inMultiSelectMode);
+ assert.ok(range2.isEqual(editor.selection.getRange()));
+
+ var range3 = new Range(0, 1, 0, 1);
+ selection.addRange(range3);
+ assert.ok(editor.inMultiSelectMode);
+ testRanges([range3, range2]);
+
+ var range4 = new Range(0, 0, 4, 0);
+ selection.addRange(range4);
+ assert.ok(!editor.inMultiSelectMode);
}
};
diff --git a/lib/ace/range.js b/lib/ace/range.js
index 163979fe..0947d9f4 100644
--- a/lib/ace/range.js
+++ b/lib/ace/range.js
@@ -117,7 +117,7 @@ var Range = function(startRow, startColumn, endRow, endColumn) {
return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;
}
- this.intersectsRange = function(range) {
+ this.intersects = function(range) {
var cmp = this.compareRange(range);
return (cmp == -1 || cmp == 0 || cmp == 1);
}
diff --git a/lib/ace/split.js b/lib/ace/split.js
index 068d5269..fc5ae07d 100644
--- a/lib/ace/split.js
+++ b/lib/ace/split.js
@@ -56,7 +56,7 @@ var Split = function(container, theme, splits) {
this.$splits = 0;
this.$editorCSS = "";
this.$editors = [];
- this.$oriantation = this.BESIDE;
+ this.$orientation = this.BESIDE;
this.setSplits(splits || 1);
this.$cEditor = this.$editors[0];
@@ -213,15 +213,15 @@ var Split = function(container, theme, splits) {
return session;
};
- this.getOriantation = function() {
- return this.$oriantation;
+ this.getOrientation = function() {
+ return this.$orientation;
};
- this.setOriantation = function(oriantation) {
- if (this.$oriantation == oriantation) {
+ this.setOrientation = function(orientation) {
+ if (this.$orientation == orientation) {
return;
}
- this.$oriantation = oriantation;
+ this.$orientation = orientation;
this.resize();
};
@@ -230,7 +230,7 @@ var Split = function(container, theme, splits) {
var height = this.$container.clientHeight;
var editor;
- if (this.$oriantation == this.BESIDE) {
+ if (this.$orientation == this.BESIDE) {
var editorWidth = width / this.$splits;
for (var i = 0; i < this.$splits; i++) {
editor = this.$editors[i];
diff --git a/lib/ace/theme/clouds.js b/lib/ace/theme/clouds.js
index 8d827f97..11a54d3d 100644
--- a/lib/ace/theme/clouds.js
+++ b/lib/ace/theme/clouds.js
@@ -68,7 +68,7 @@ exports.cssText = "\
}\
\
.ace-clouds .ace_cursor {\
- border-left: 1px solid #000000;\
+ border-left: 2px solid #000000;\
}\
\
.ace-clouds .ace_cursor.ace_overwrite {\
@@ -80,6 +80,11 @@ exports.cssText = "\
background: #BDD5FC;\
}\
\
+.ace-clouds.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px #FFFFFF;\
+ border-radius: 2px;\
+}\
+\
.ace-clouds .ace_marker-layer .ace_step {\
background: rgb(198, 219, 174);\
}\
diff --git a/lib/ace/theme/clouds_midnight.js b/lib/ace/theme/clouds_midnight.js
index be2673c7..094f95de 100644
--- a/lib/ace/theme/clouds_midnight.js
+++ b/lib/ace/theme/clouds_midnight.js
@@ -68,7 +68,7 @@ exports.cssText = "\
}\
\
.ace-clouds-midnight .ace_cursor {\
- border-left: 1px solid #7DA5DC;\
+ border-left: 2px solid #7DA5DC;\
}\
\
.ace-clouds-midnight .ace_cursor.ace_overwrite {\
@@ -80,6 +80,11 @@ exports.cssText = "\
background: #000000;\
}\
\
+.ace-clouds-midnight.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px #191919;\
+ border-radius: 2px;\
+}\
+\
.ace-clouds-midnight .ace_marker-layer .ace_step {\
background: rgb(198, 219, 174);\
}\
diff --git a/lib/ace/theme/cobalt.js b/lib/ace/theme/cobalt.js
index b678a5cf..0b461b39 100644
--- a/lib/ace/theme/cobalt.js
+++ b/lib/ace/theme/cobalt.js
@@ -68,7 +68,7 @@ exports.cssText = "\
}\
\
.ace-cobalt .ace_cursor {\
- border-left: 1px solid #FFFFFF;\
+ border-left: 2px solid #FFFFFF;\
}\
\
.ace-cobalt .ace_cursor.ace_overwrite {\
@@ -80,6 +80,11 @@ exports.cssText = "\
background: rgba(179, 101, 57, 0.75);\
}\
\
+.ace-cobalt.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px #002240;\
+ border-radius: 2px;\
+}\
+\
.ace-cobalt .ace_marker-layer .ace_step {\
background: rgb(198, 219, 174);\
}\
diff --git a/lib/ace/theme/dawn.js b/lib/ace/theme/dawn.js
index 9fd4f22f..1974a94d 100644
--- a/lib/ace/theme/dawn.js
+++ b/lib/ace/theme/dawn.js
@@ -68,7 +68,7 @@ exports.cssText = "\
}\
\
.ace-dawn .ace_cursor {\
- border-left: 1px solid #000000;\
+ border-left: 2px solid #000000;\
}\
\
.ace-dawn .ace_cursor.ace_overwrite {\
@@ -80,6 +80,11 @@ exports.cssText = "\
background: rgba(39, 95, 255, 0.30);\
}\
\
+.ace-dawn.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px #F9F9F9;\
+ border-radius: 2px;\
+}\
+\
.ace-dawn .ace_marker-layer .ace_step {\
background: rgb(198, 219, 174);\
}\
diff --git a/lib/ace/theme/eclipse.js b/lib/ace/theme/eclipse.js
index ed2376a0..8f0bc7c9 100644
--- a/lib/ace/theme/eclipse.js
+++ b/lib/ace/theme/eclipse.js
@@ -67,7 +67,7 @@ exports.cssText = ".ace-eclipse .ace_editor {\
}\
\
.ace-eclipse .ace_cursor {\
- border-left: 1px solid black;\
+ border-left: 2px solid black;\
}\
\
.ace-eclipse .ace_line .ace_storage,\
diff --git a/lib/ace/theme/idle_fingers.js b/lib/ace/theme/idle_fingers.js
index b1acacb7..9da3d396 100644
--- a/lib/ace/theme/idle_fingers.js
+++ b/lib/ace/theme/idle_fingers.js
@@ -68,7 +68,7 @@ exports.cssText = "\
}\
\
.ace-idle-fingers .ace_cursor {\
- border-left: 1px solid #91FF00;\
+ border-left: 2px solid #91FF00;\
}\
\
.ace-idle-fingers .ace_cursor.ace_overwrite {\
@@ -80,6 +80,11 @@ exports.cssText = "\
background: rgba(90, 100, 126, 0.88);\
}\
\
+.ace-idle-fingers.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px #323232;\
+ border-radius: 2px;\
+}\
+\
.ace-idle-fingers .ace_marker-layer .ace_step {\
background: rgb(198, 219, 174);\
}\
diff --git a/lib/ace/theme/kr_theme.js b/lib/ace/theme/kr_theme.js
index bcd31b67..413d55d2 100644
--- a/lib/ace/theme/kr_theme.js
+++ b/lib/ace/theme/kr_theme.js
@@ -68,7 +68,7 @@ exports.cssText = "\
}\
\
.ace-kr-theme .ace_cursor {\
- border-left: 1px solid #FF9900;\
+ border-left: 2px solid #FF9900;\
}\
\
.ace-kr-theme .ace_cursor.ace_overwrite {\
@@ -80,6 +80,11 @@ exports.cssText = "\
background: rgba(170, 0, 255, 0.45);\
}\
\
+.ace-kr-theme.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px #0B0A09;\
+ border-radius: 2px;\
+}\
+\
.ace-kr-theme .ace_marker-layer .ace_step {\
background: rgb(198, 219, 174);\
}\
diff --git a/lib/ace/theme/merbivore.js b/lib/ace/theme/merbivore.js
index 59a78d6d..95927960 100644
--- a/lib/ace/theme/merbivore.js
+++ b/lib/ace/theme/merbivore.js
@@ -68,7 +68,7 @@ exports.cssText = "\
}\
\
.ace-merbivore .ace_cursor {\
- border-left: 1px solid #FFFFFF;\
+ border-left: 2px solid #FFFFFF;\
}\
\
.ace-merbivore .ace_cursor.ace_overwrite {\
@@ -80,6 +80,11 @@ exports.cssText = "\
background: #454545;\
}\
\
+.ace-merbivore.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px #161616;\
+ border-radius: 2px;\
+}\
+\
.ace-merbivore .ace_marker-layer .ace_step {\
background: rgb(198, 219, 174);\
}\
diff --git a/lib/ace/theme/merbivore_soft.js b/lib/ace/theme/merbivore_soft.js
index 1ffedc14..107d6df6 100644
--- a/lib/ace/theme/merbivore_soft.js
+++ b/lib/ace/theme/merbivore_soft.js
@@ -68,7 +68,7 @@ exports.cssText = "\
}\
\
.ace-merbivore-soft .ace_cursor {\
- border-left: 1px solid #FFFFFF;\
+ border-left: 2px solid #FFFFFF;\
}\
\
.ace-merbivore-soft .ace_cursor.ace_overwrite {\
@@ -80,6 +80,11 @@ exports.cssText = "\
background: #494949;\
}\
\
+.ace-merbivore-soft.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px #1C1C1C;\
+ border-radius: 2px;\
+}\
+\
.ace-merbivore-soft .ace_marker-layer .ace_step {\
background: rgb(198, 219, 174);\
}\
diff --git a/lib/ace/theme/mono_industrial.js b/lib/ace/theme/mono_industrial.js
index 85c7313a..fdf47fa2 100644
--- a/lib/ace/theme/mono_industrial.js
+++ b/lib/ace/theme/mono_industrial.js
@@ -68,7 +68,7 @@ exports.cssText = "\
}\
\
.ace-mono-industrial .ace_cursor {\
- border-left: 1px solid #FFFFFF;\
+ border-left: 2px solid #FFFFFF;\
}\
\
.ace-mono-industrial .ace_cursor.ace_overwrite {\
@@ -80,6 +80,11 @@ exports.cssText = "\
background: rgba(145, 153, 148, 0.40);\
}\
\
+.ace-mono-industrial.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px #222C28;\
+ border-radius: 2px;\
+}\
+\
.ace-mono-industrial .ace_marker-layer .ace_step {\
background: rgb(198, 219, 174);\
}\
diff --git a/lib/ace/theme/monokai.js b/lib/ace/theme/monokai.js
index 98782855..ba5fca86 100644
--- a/lib/ace/theme/monokai.js
+++ b/lib/ace/theme/monokai.js
@@ -68,7 +68,7 @@ exports.cssText = "\
}\
\
.ace-monokai .ace_cursor {\
- border-left: 1px solid #F8F8F0;\
+ border-left: 2px solid #F8F8F0;\
}\
\
.ace-monokai .ace_cursor.ace_overwrite {\
@@ -80,6 +80,11 @@ exports.cssText = "\
background: #49483E;\
}\
\
+.ace-monokai.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px #272822;\
+ border-radius: 2px;\
+}\
+\
.ace-monokai .ace_marker-layer .ace_step {\
background: rgb(198, 219, 174);\
}\
diff --git a/lib/ace/theme/pastel_on_dark.js b/lib/ace/theme/pastel_on_dark.js
index 3a95a36f..3399e7ce 100644
--- a/lib/ace/theme/pastel_on_dark.js
+++ b/lib/ace/theme/pastel_on_dark.js
@@ -68,7 +68,7 @@ exports.cssText = "\
}\
\
.ace-pastel-on-dark .ace_cursor {\
- border-left: 1px solid #A7A7A7;\
+ border-left: 2px solid #A7A7A7;\
}\
\
.ace-pastel-on-dark .ace_cursor.ace_overwrite {\
@@ -80,6 +80,11 @@ exports.cssText = "\
background: rgba(221, 240, 255, 0.20);\
}\
\
+.ace-pastel-on-dark.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px #2C2828;\
+ border-radius: 2px;\
+}\
+\
.ace-pastel-on-dark .ace_marker-layer .ace_step {\
background: rgb(198, 219, 174);\
}\
diff --git a/lib/ace/theme/solarized_dark.js b/lib/ace/theme/solarized_dark.js
index 159f17bd..35ff5ae9 100644
--- a/lib/ace/theme/solarized_dark.js
+++ b/lib/ace/theme/solarized_dark.js
@@ -68,7 +68,7 @@ exports.cssText = "\
}\
\
.ace-solarized-dark .ace_cursor {\
- border-left: 1px solid #D30102;\
+ border-left: 2px solid #D30102;\
}\
\
.ace-solarized-dark .ace_cursor.ace_overwrite {\
@@ -80,6 +80,11 @@ exports.cssText = "\
background: #073642;\
}\
\
+.ace-solarized-dark.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px #002B36;\
+ border-radius: 2px;\
+}\
+\
.ace-solarized-dark .ace_marker-layer .ace_step {\
background: rgb(198, 219, 174);\
}\
diff --git a/lib/ace/theme/solarized_light.js b/lib/ace/theme/solarized_light.js
index dc635f59..1327ce64 100644
--- a/lib/ace/theme/solarized_light.js
+++ b/lib/ace/theme/solarized_light.js
@@ -68,7 +68,7 @@ exports.cssText = "\
}\
\
.ace-solarized-light .ace_cursor {\
- border-left: 1px solid #000000;\
+ border-left: 2px solid #000000;\
}\
\
.ace-solarized-light .ace_cursor.ace_overwrite {\
@@ -80,6 +80,11 @@ exports.cssText = "\
background: #073642;\
}\
\
+.ace-solarized-light.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px #FDF6E3;\
+ border-radius: 2px;\
+}\
+\
.ace-solarized-light .ace_marker-layer .ace_step {\
background: rgb(198, 219, 174);\
}\
diff --git a/lib/ace/theme/textmate.js b/lib/ace/theme/textmate.js
index 71885186..76eb0673 100644
--- a/lib/ace/theme/textmate.js
+++ b/lib/ace/theme/textmate.js
@@ -67,7 +67,7 @@ exports.cssText = ".ace-tm .ace_editor {\
}\
\
.ace-tm .ace_cursor {\
- border-left: 1px solid black;\
+ border-left: 2px solid black;\
}\
\
.ace-tm .ace_cursor.ace_overwrite {\
@@ -169,7 +169,10 @@ exports.cssText = ".ace-tm .ace_editor {\
.ace-tm .ace_marker-layer .ace_selection {\
background: rgb(181, 213, 255);\
}\
-\
+.ace-tm.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px white;\
+ border-radius: 2px;\
+}\
.ace-tm .ace_marker-layer .ace_step {\
background: rgb(252, 255, 0);\
}\
diff --git a/lib/ace/theme/tomorrow.js b/lib/ace/theme/tomorrow.js
index 3447769a..14e19d77 100644
--- a/lib/ace/theme/tomorrow.js
+++ b/lib/ace/theme/tomorrow.js
@@ -68,7 +68,7 @@ exports.cssText = "\
}\
\
.ace-tomorrow .ace_cursor {\
- border-left: 1px solid #AEAFAD;\
+ border-left: 2px solid #AEAFAD;\
}\
\
.ace-tomorrow .ace_cursor.ace_overwrite {\
@@ -80,6 +80,11 @@ exports.cssText = "\
background: #D6D6D6;\
}\
\
+.ace-tomorrow.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px #FFFFFF;\
+ border-radius: 2px;\
+}\
+\
.ace-tomorrow .ace_marker-layer .ace_step {\
background: rgb(198, 219, 174);\
}\
diff --git a/lib/ace/theme/tomorrow_night.js b/lib/ace/theme/tomorrow_night.js
index 141912de..621c6bb8 100644
--- a/lib/ace/theme/tomorrow_night.js
+++ b/lib/ace/theme/tomorrow_night.js
@@ -68,7 +68,7 @@ exports.cssText = "\
}\
\
.ace-tomorrow-night .ace_cursor {\
- border-left: 1px solid #AEAFAD;\
+ border-left: 2px solid #AEAFAD;\
}\
\
.ace-tomorrow-night .ace_cursor.ace_overwrite {\
@@ -80,6 +80,11 @@ exports.cssText = "\
background: #373B41;\
}\
\
+.ace-tomorrow-night.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px #1D1F21;\
+ border-radius: 2px;\
+}\
+\
.ace-tomorrow-night .ace_marker-layer .ace_step {\
background: rgb(198, 219, 174);\
}\
diff --git a/lib/ace/theme/tomorrow_night_blue.js b/lib/ace/theme/tomorrow_night_blue.js
index eae9284d..72ffb2bc 100644
--- a/lib/ace/theme/tomorrow_night_blue.js
+++ b/lib/ace/theme/tomorrow_night_blue.js
@@ -68,7 +68,7 @@ exports.cssText = "\
}\
\
.ace-tomorrow-night-blue .ace_cursor {\
- border-left: 1px solid #FFFFFF;\
+ border-left: 2px solid #FFFFFF;\
}\
\
.ace-tomorrow-night-blue .ace_cursor.ace_overwrite {\
@@ -80,6 +80,11 @@ exports.cssText = "\
background: #003F8E;\
}\
\
+.ace-tomorrow-night-blue.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px #002451;\
+ border-radius: 2px;\
+}\
+\
.ace-tomorrow-night-blue .ace_marker-layer .ace_step {\
background: rgb(198, 219, 174);\
}\
diff --git a/lib/ace/theme/tomorrow_night_bright.js b/lib/ace/theme/tomorrow_night_bright.js
index a03817d8..6d5f2c2f 100644
--- a/lib/ace/theme/tomorrow_night_bright.js
+++ b/lib/ace/theme/tomorrow_night_bright.js
@@ -68,7 +68,7 @@ exports.cssText = "\
}\
\
.ace-tomorrow-night-bright .ace_cursor {\
- border-left: 1px solid #9F9F9F;\
+ border-left: 2px solid #9F9F9F;\
}\
\
.ace-tomorrow-night-bright .ace_cursor.ace_overwrite {\
@@ -80,6 +80,11 @@ exports.cssText = "\
background: #424242;\
}\
\
+.ace-tomorrow-night-bright.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px #000000;\
+ border-radius: 2px;\
+}\
+\
.ace-tomorrow-night-bright .ace_marker-layer .ace_step {\
background: rgb(198, 219, 174);\
}\
diff --git a/lib/ace/theme/tomorrow_night_eighties.js b/lib/ace/theme/tomorrow_night_eighties.js
index 09ad2839..f6a67d4e 100644
--- a/lib/ace/theme/tomorrow_night_eighties.js
+++ b/lib/ace/theme/tomorrow_night_eighties.js
@@ -68,7 +68,7 @@ exports.cssText = "\
}\
\
.ace-tomorrow-night-eighties .ace_cursor {\
- border-left: 1px solid #CCCCCC;\
+ border-left: 2px solid #CCCCCC;\
}\
\
.ace-tomorrow-night-eighties .ace_cursor.ace_overwrite {\
@@ -80,6 +80,11 @@ exports.cssText = "\
background: #515151;\
}\
\
+.ace-tomorrow-night-eighties.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px #2D2D2D;\
+ border-radius: 2px;\
+}\
+\
.ace-tomorrow-night-eighties .ace_marker-layer .ace_step {\
background: rgb(198, 219, 174);\
}\
diff --git a/lib/ace/theme/twilight.js b/lib/ace/theme/twilight.js
index 633ab66c..842dd234 100644
--- a/lib/ace/theme/twilight.js
+++ b/lib/ace/theme/twilight.js
@@ -68,7 +68,7 @@ exports.cssText = "\
}\
\
.ace-twilight .ace_cursor {\
- border-left: 1px solid #A7A7A7;\
+ border-left: 2px solid #A7A7A7;\
}\
\
.ace-twilight .ace_cursor.ace_overwrite {\
@@ -80,6 +80,11 @@ exports.cssText = "\
background: rgba(221, 240, 255, 0.20);\
}\
\
+.ace-twilight.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px #141414;\
+ border-radius: 2px;\
+}\
+\
.ace-twilight .ace_marker-layer .ace_step {\
background: rgb(198, 219, 174);\
}\
diff --git a/lib/ace/theme/vibrant_ink.js b/lib/ace/theme/vibrant_ink.js
index 4d497b03..fac89c15 100644
--- a/lib/ace/theme/vibrant_ink.js
+++ b/lib/ace/theme/vibrant_ink.js
@@ -68,7 +68,7 @@ exports.cssText = "\
}\
\
.ace-vibrant-ink .ace_cursor {\
- border-left: 1px solid #FFFFFF;\
+ border-left: 2px solid #FFFFFF;\
}\
\
.ace-vibrant-ink .ace_cursor.ace_overwrite {\
@@ -80,6 +80,11 @@ exports.cssText = "\
background: #6699CC;\
}\
\
+.ace-vibrant-ink.multiselect .ace_selection.start {\
+ box-shadow: 0 0 3px 0px #0F0F0F;\
+ border-radius: 2px;\
+}\
+\
.ace-vibrant-ink .ace_marker-layer .ace_step {\
background: rgb(198, 219, 174);\
}\
diff --git a/lib/ace/tokenizer.js b/lib/ace/tokenizer.js
index 674e30ed..f24d2191 100644
--- a/lib/ace/tokenizer.js
+++ b/lib/ace/tokenizer.js
@@ -119,9 +119,8 @@ var Tokenizer = function(rules, flag) {
else
type = rule.token;
- var next = rule.next;
- if (next && next !== currentState) {
- currentState = next;
+ if (rule.next) {
+ currentState = rule.next;
state = this.rules[currentState];
mapping = this.matchMappings[currentState];
lastIndex = re.lastIndex;
diff --git a/tool/Theme.tmpl.css b/tool/Theme.tmpl.css
index 308f63ff..1d6aca07 100644
--- a/tool/Theme.tmpl.css
+++ b/tool/Theme.tmpl.css
@@ -27,7 +27,7 @@
}
.%cssClass% .ace_cursor {
- border-left: 1px solid %cursor%;
+ border-left: 2px solid %cursor%;
}
.%cssClass% .ace_cursor.ace_overwrite {
@@ -39,6 +39,11 @@
background: %selection%;
}
+.%cssClass%.multiselect .ace_selection.start {
+ box-shadow: 0 0 3px 0px %background%;
+ border-radius: 2px;
+}
+
.%cssClass% .ace_marker-layer .ace_step {
background: %step%;
}