在 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>

我查看了 editoreditor.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 编辑器中重置撤消堆栈的主要内容,如果未能解决你的问题,请参考以下文章

如何重置(撤消)a:hover 属性

使用 QUndoCommand 的子级/父级推送多个命令以一次撤消堆栈

如何在我的网站中嵌入 ace 编辑器 [重复]

如何在 ACE 编辑器中突出显示某行?

我如何从 ACE 编辑器中获得价值?

在 ACE 编辑器中以编程方式折叠代码