跨会话保留 ACE 编辑器 UndoManager
Persist the ACE editor UndoManager across sessions
我想坚持Ace Editor's UndoManager
instance across browser sessions, the way the Cloud9 IDE好像。
我已经尝试将 UndoManager
对象字符串化,以便我可以将它存储在某个地方以便以后像这样检索它:
let undoManager = editorHTML.getSession().getUndoManager();
let undoManagerStr = JSON.stringify(undoManager);
但是 stringify 调用抛出异常 Uncaught TypeError: Converting circular structure to JSON
我也试过提取对象的碎片进行存储:
let redoStackStr = JSON.stringify(undoManager.$redoStack, null, 2);
let undoStackStr = JSON.stringify(undoManager.$undoStack, null, 2);
let dirtyCounter = undoManager.dirtyCounter;
.
let manager = new ace.UndoManager();
if(redoStackStr && undoStackStr && dirtyCounter) {
manager.$redoStack = JSON.parse(redoStackStr);
manager.$undoStack = JSON.parse(undoStackStr);
manager.dirtyCounter = dirtyCounter;
}
editorHTML.getSession().setUndoManager(manager)
但是 Ace 根本不喜欢这个,并且在 CTRL-Z 上爆炸
我宁愿不必编写自己的文件历史管理器,因为它已经存在。
编辑
我能够使用下面选择的答案解决这个问题,但只有在升级到 Ace 编辑器版本 1.4.2 之后。上面的代码是我分析了1.2.8版本的UndoManager
之后的尝试,所以才这么不一样。
对于 ace 1.4,您提到的第二种方法有效,您的示例中唯一的问题是 dirtyCounter 未定义
UndoManager = require("ace/undomanager").UndoManager
undoManager = editor.session.$undoManager
var str = JSON.stringify({
$redoStack: undoManager.$redoStack,
$undoStack: undoManager.$undoStack,
mark: undoManager.mark,
$rev: undoManager.$rev,
})
var manager = new UndoManager();
if (str) {
var json = JSON.parse(str)
manager.$redoStack = json.$redoStack;
manager.$undoStack = json.$undoStack
manager.mark = json.mark
manager.$rev = json.$rev
}
editor.getSession().setUndoManager(manager)
但请注意,如果您对具有不同值的会话执行此操作,将会失败。
我想坚持Ace Editor's UndoManager
instance across browser sessions, the way the Cloud9 IDE好像。
我已经尝试将 UndoManager
对象字符串化,以便我可以将它存储在某个地方以便以后像这样检索它:
let undoManager = editorHTML.getSession().getUndoManager();
let undoManagerStr = JSON.stringify(undoManager);
但是 stringify 调用抛出异常 Uncaught TypeError: Converting circular structure to JSON
我也试过提取对象的碎片进行存储:
let redoStackStr = JSON.stringify(undoManager.$redoStack, null, 2);
let undoStackStr = JSON.stringify(undoManager.$undoStack, null, 2);
let dirtyCounter = undoManager.dirtyCounter;
.
let manager = new ace.UndoManager();
if(redoStackStr && undoStackStr && dirtyCounter) {
manager.$redoStack = JSON.parse(redoStackStr);
manager.$undoStack = JSON.parse(undoStackStr);
manager.dirtyCounter = dirtyCounter;
}
editorHTML.getSession().setUndoManager(manager)
但是 Ace 根本不喜欢这个,并且在 CTRL-Z 上爆炸
我宁愿不必编写自己的文件历史管理器,因为它已经存在。
编辑
我能够使用下面选择的答案解决这个问题,但只有在升级到 Ace 编辑器版本 1.4.2 之后。上面的代码是我分析了1.2.8版本的UndoManager
之后的尝试,所以才这么不一样。
对于 ace 1.4,您提到的第二种方法有效,您的示例中唯一的问题是 dirtyCounter 未定义
UndoManager = require("ace/undomanager").UndoManager
undoManager = editor.session.$undoManager
var str = JSON.stringify({
$redoStack: undoManager.$redoStack,
$undoStack: undoManager.$undoStack,
mark: undoManager.mark,
$rev: undoManager.$rev,
})
var manager = new UndoManager();
if (str) {
var json = JSON.parse(str)
manager.$redoStack = json.$redoStack;
manager.$undoStack = json.$undoStack
manager.mark = json.mark
manager.$rev = json.$rev
}
editor.getSession().setUndoManager(manager)
但请注意,如果您对具有不同值的会话执行此操作,将会失败。