To get text's before edit, you could use beforeChange
event.
Than the text fetching is pretty straightforward.
beforeChange
also has nice property, as it's fired for each change (no chaining as with change
).
cm.on("beforeChange", function (cm, change) {
var before = cm.getRange({ line: 0, ch: 0 }, change.from);
var text = cm.getRange(change.from, change.to);
var after = cm.getRange(change.to, { line: cm.lineCount() + 1, ch: 0 });
console.log("before change", before, text, after);
});
If you need the text after change, than you have to calculate to
in post-change coordinate system. Luckily it's quite easy still:
cm.on("change", function (cm, change) {
var from = change.from;
var text = change.text.join("\n");
var removed = change.removed.join("\n");
var to = cm.posFromIndex(cm.indexFromPos(from) + text.length);
var before = cm.getRange({ line: 0, ch: 0 }, from);
var after = cm.getRange(to, { line: cm.lineCount() + 1, ch: 0 });
console.log("after change", before, removed, text, after);
});
Hopes this works, I hadn't time to test it properly.