function duplicateText(editor) {
        editor = editor || EditorManager.getFocusedEditor();
        if (!editor) {
            return;
        }

        var selections = editor.getSelections(),
            delimiter = "",
            edits = [],
            rangeSels = [],
            cursorSels = [],
            doc = editor.document;

        // When there are multiple selections, we want to handle all the cursors first (duplicating
        // their lines), then all the ranges (duplicating the ranges).
        _.each(selections, function (sel) {
            if (CodeMirror.cmpPos(sel.start, sel.end) === 0) {
                cursorSels.push(sel);
            } else {
                rangeSels.push(sel);
            }
        });

        var cursorLineSels = editor.convertToLineSelections(cursorSels);
        _.each(cursorLineSels, function (lineSel, index) {
            var sel = lineSel.selectionForEdit;
            if (sel.end.line === editor.lineCount()) {
                delimiter = "\n";
            }
            // Don't need to explicitly track selections since we are doing the edits in such a way that
            // the existing selections will get appropriately updated.
            edits.push({edit: {text: doc.getRange(sel.start, sel.end) + delimiter, start: sel.start }});
        });
        _.each(rangeSels, function (sel) {
            edits.push({edit: {text: doc.getRange(sel.start, sel.end), start: sel.start }});
        });

        doc.doMultipleEdits(edits);
    }
function duplicateText(editor) {
        editor = editor || EditorManager.getFocusedEditor();
        if (!editor) {
            return;
        }

        var selections = editor.getSelections(),
            delimiter = "",
            edits = [],
            rangeSels = [],
            cursorSels = [],
            doc = editor.document;

        // When there are multiple selections, we want to handle all the cursors first (duplicating
        // their lines), then all the ranges (duplicating the ranges).
        _.each(selections, function (sel) {
            if (CodeMirror.cmpPos(sel.start, sel.end) === 0) {
                cursorSels.push(sel);
            } else {
                rangeSels.push(sel);
            }
        });

        var cursorLineSels = editor.convertToLineSelections(cursorSels);
        _.each(cursorLineSels, function (lineSel, index) {
            var sel = lineSel.selectionForEdit;
            if (sel.end.line === editor.lineCount()) {
                delimiter = "\n";
            }
            // Don't need to explicitly track selections since we are doing the edits in such a way that
            // the existing selections will get appropriately updated.
            edits.push({edit: {text: doc.getRange(sel.start, sel.end) + delimiter, start: sel.start }});
        });
        _.each(rangeSels, function (sel) {
            edits.push({edit: {text: doc.getRange(sel.start, sel.end), start: sel.start }});
        });

        doc.doMultipleEdits(edits);
    }
function duplicateText ( editor ) { editor = editor || EditorManager . getFocusedEditor ( ) ; if ( ! editor ) { return ; } var selections = editor . getSelections ( ) , delimiter = "" , edits = [ ] , rangeSels = [ ] , cursorSels = [ ] , doc = editor . document ; // When there are multiple selections, we want to handle all the cursors first (duplicating // their lines), then all the ranges (duplicating the ranges). _ . each ( selections , function ( sel ) { if ( CodeMirror . cmpPos ( sel . start , sel . end ) === 0 ) { cursorSels . push ( sel ) ; } else { rangeSels . push ( sel ) ; } } ) ; var cursorLineSels = editor . convertToLineSelections ( cursorSels ) ; _ . each ( cursorLineSels , function ( lineSel , index ) { var sel = lineSel . selectionForEdit ; if ( sel . end . line === editor . lineCount ( ) ) { delimiter = "\n" ; } // Don't need to explicitly track selections since we are doing the edits in such a way that // the existing selections will get appropriately updated. edits . push ( { edit : { text : doc . getRange ( sel . start , sel . end ) + delimiter , start : sel . start } } ) ; } ) ; _ . each ( rangeSels , function ( sel ) { edits . push ( { edit : { text : doc . getRange ( sel . start , sel . end ) , start : sel . start } } ) ; } ) ; doc . doMultipleEdits ( edits ) ; }
Duplicates the selected text, or current line if no selection. The cursor/selection is left
on the second copy.
Duplicates the selected text or current line if no selection . The cursor / selection is left on the second copy .
Duplicate text from the editor