diff --git a/lib/ace/commands/default_commands.js b/lib/ace/commands/default_commands.js index 99f18be8..17304557 100644 --- a/lib/ace/commands/default_commands.js +++ b/lib/ace/commands/default_commands.js @@ -319,6 +319,11 @@ exports.commands = [{ bindKey: bindKey("Ctrl-D", "Command-D"), exec: function(editor) { editor.removeLines(); }, multiSelectAction: "forEach" +}, { + name: "duplicateSelection", + bindKey: bindKey("Ctrl-Shift-D", "Command-Shift-D"), + exec: function(editor) { editor.duplicateSelection(); }, + multiSelectAction: "forEach" }, { name: "togglecomment", bindKey: bindKey("Ctrl-/", "Command-/"), diff --git a/lib/ace/editor.js b/lib/ace/editor.js index e6d30eca..20f0fb69 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -1348,6 +1348,24 @@ var Editor = function(renderer, session) { this.clearSelection(); }; + this.duplicateSelection = function() { + var sel = this.selection; + var doc = this.session; + var range = sel.getRange(); + if (range.isEmpty()) { + var row = range.start.row; + doc.duplicateLines(row, row); + } else { + var reverse = sel.isBackwards() + var point = sel.isBackwards() ? range.start : range.end; + var endPoint = doc.insert(point, doc.getTextRange(range), false); + range.start = point; + range.end = endPoint; + + sel.setSelectionRange(range, reverse) + } + }; + /** related to: EditSession.moveLinesDown * Editor.moveLinesDown() -> Number * + (Number): On success, it returns -1.