在 ACE 编辑器中重置撤消堆栈
Posted
技术标签:
【中文标题】在 ACE 编辑器中重置撤消堆栈【英文标题】:Reset the undo stack in ACE editor 【发布时间】:2015-09-08 07:19:01 【问题描述】:我想重置ACE editor 中的撤消堆栈。行为应该是:
-
我在编辑器中做了一些更改。
调用一些魔术函数来重置撤消堆栈
尝试撤消时,由于撤消堆栈已重置,因此无法执行此操作。
我猜这与来自 ACE 的 UndoManager
有关,但我不知道如何在以下示例中使用它。
var editor = ace.edit("editor");
editor.setTheme("ace/theme/monokai");
editor.getSession().setMode("ace/mode/markdown");
setTimeout(function()
editor.setValue("And now how can I reset the\nundo stack,so pressing\nCTRL+Z (or Command + Z) will *NOT*\ngo back to previous value?", -1);
, 3000);
#editor
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
font-size: 25px;
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.1.9/ace.js"></script>
<div id="editor">This value will be changed in 3 seconds.</div>
我查看了 editor
和 editor.session
原型以找到一些辅助函数,但没有成功。
【问题讨论】:
【参考方案1】:是的,UndoManager
是维护所有历史记录的类。
解决方案是使用空白/新创建的类来初始化会话。
查看 sn-p。
var editor = ace.edit("editor");
editor.setTheme("ace/theme/monokai");
editor.getSession().setMode("ace/mode/markdown");
setTimeout(function()
editor.setValue("And now how can I reset the\nundo stack,so pressing\nCTRL+Z (or Command + Z) will *NOT*\ngo back to previous value?", -1);
editor.getSession().setUndoManager(new ace.UndoManager())
, 3000);
#editor
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
font-size: 25px;
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.1.9/ace.js"></script>
<div id="editor">This value will be changed in 3 seconds.</div>
【讨论】:
但现在我不能按 CTRL + Z 任何东西。 是的,我猜这就是要求?或者您只想删除最后一次更改,即 javascript 发生的更改?请澄清... 我想在此之前重置所有内容,但之后我希望能够使用撤消。 您可以调用getUndoManager().reset()
函数,而不是创建新的撤消管理器。只要您在setTimeout()
调用中执行此操作,您就会得到相同的结果。另外,我将超时设置为700
ms。
这太棒了。我正在做一个项目,我有多个文档可以在同一个 ace 编辑器中切换。使用$.extend(, getUndoManager())
我可以保存当前的撤消操作。然后当填充编辑器时,我重置为一个新的撤消管理器,如果该文档上有一个现有的撤消管理器,我将其放入。在所有文档中保留我的撤消历史记录,而无需复制 ace 编辑器。【参考方案2】:
使用editor.session.setValue()
或致电editor.session.getUndoManager().reset();
见https://github.com/ajaxorg/ace/blob/v1.1.9/lib/ace/edit_session.js#L279
【讨论】:
嗯,我尝试使用reset()
方法,但是it doesn't work,为什么?
因为看起来 editor.session.getUndoManager() 返回了 undoManger 的构造函数,所以它返回函数:function() this.reset()
立即调用reset不起作用,因为更改会在超时后添加到undoManager
我建议在这里组合答案:setTimeout(function() editor.getSession().getUndoManager().reset(); , 700);
只需使用 editor.session.setValue() 和 reset() 将在设置值后调用。所以不需要使用定时器。以上是关于在 ACE 编辑器中重置撤消堆栈的主要内容,如果未能解决你的问题,请参考以下文章