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); */
}
});
А также есть другие события "вырезать", "копировать" и "вставить" (http://codemirror.net/doc/manual.html#events), так что это будет работать:
editor.on('paste', function(cm, event) { ... } );
Кроме того, вы можете отменить событие, вызвав event.preventDefault(); но получение вставленного текста является проблемой.
В настоящее время я работаю над похожей вещью - перехватываю события копирования/вставки и делаю некоторые замены. Я нашел решение для программного копирования текста в буфер обмена. Это clipboard.js обсуждается здесь Предоставляет ли codemirror API вырезания, копирования и вставки?. Самое замечательное, что вы можете запускать событие клика программно (это было проблемой, когда я использовал ZeroClipboard с кросс-браузерной прокладкой флэш-памяти), и это будет работать!
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();
});
person
NesCafe Zos42
schedule
03.04.2016