CodeMirror2:如何格式化粘贴的内容?

aga*_*ner 5 javascript codemirror

是否可以在CodeMirror2中的“ onPaste”之类的事件之后格式化插入的内容?-我想在粘贴后缩进剪贴板中的内容。我已经知道使用JavaScript不可能访问剪贴板。

所以我认为也没有创建带有剪切/复制/粘贴功能的上下文菜单的可能性吗?-我可以创建自己的JS剪贴板吗,还是有现有的解决方案?

谢谢!勒克斯

小智 3

CodeMirror 有本机“inputRead”事件,因此您可以执行以下操作:

editor.on('inputRead', function(cm, event) {
    /* event -> object{
         origin: string, can be '+input', '+move' or 'paste'
             doc for origins >> http://codemirror.net/doc/manual.html#selection_origin
         from: object {line, ch},
         to: object {line, ch},
         removed: array of removed strings
         text: array of pasted strings
    } */
    if (event.origin == 'paste') {
        console.log(event.text);
        var text = event.text[0]; // pasted string
        var new_text = '['+text+']'; // any operations here
        cm.refresh();
        // my first idea was
        // note: for multiline strings may need more complex calculations
        cm.replaceRange(new_text, event.from, {line: event.from.line, ch: event.from.ch + text.length});
        // first solution did'nt work (before i guess to call refresh) so i tried that way, works too
        /* cm.execCommand('undo');
        cm.setCursor(event.from);
        cm.replaceSelection(new_text); */
    }
});
Run Code Online (Sandbox Code Playgroud)

还有其他事件“剪切”,“复制”和“粘贴”(http://codemirror.net/doc/manual.html#events),所以这将起作用:

editor.on('paste', function(cm, event) { ... } );
Run Code Online (Sandbox Code Playgroud)

优点是您可以通过调用 event.preventDefault() 来取消事件;但检索粘贴的文本是一个问题。

目前我正在研究类似的事情 - 挂钩复制/粘贴事件并进行一些替换。我找到了一种以编程方式将文本复制到剪贴板的解决方案。这是 这里讨论的clipboard.js codemirror是否提供剪切、复制和粘贴API?。最棒的是你可以以编程方式触发点击事件(当我将 ZeroClipboard 与跨浏览器 flash shim 一起使用时这是一个问题)并且它会起作用!

new Clipboard('.btn-copy', {
    text: function(trigger) {
        var text = editor.getValue(); // or editor.getSelection();
        return text.replace(/\s+/g,' ');
    }
});

editor.on('copy', function(cm, event) {
    $('.btn-copy').click();
    event.preventDefault();
});
Run Code Online (Sandbox Code Playgroud)