在ACE编辑器中重置撤消堆栈

Ion*_*zău 17 javascript undo ace-editor

我想在ACE编辑器中重置撤消堆栈.行为应该是:

  1. 我在编辑器中做了一些更改.
  2. 调用一些魔术函数来重置撤消堆栈
  3. 尝试撤消时,这是不可能的,因为撤消堆栈已重置.

我想这与UndoManagerACE有关,但我不知道如何在以下示例中使用它.

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);
Run Code Online (Sandbox Code Playgroud)
#editor {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  font-size: 25px;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

我已经调查editoreditor.session原型找一些辅助功能,但没有成功.

skb*_*ly7 23

是的,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);
  editor.getSession().setUndoManager(new ace.UndoManager())
}, 3000);
Run Code Online (Sandbox Code Playgroud)
#editor {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  font-size: 25px;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

  • 您可以只调用`getUndoManager().reset()`函数,而不是创建新的撤消管理器.只要你在`setTimeout()`调用中执行它,就会得到相同的结果.另外,我将超时设置为"700"ms. (3认同)
  • 是的,我猜这就是要求?或者你只是想删除最后的更改,即 JavaScript 发生的更改?请澄清... (2认同)
  • 这太棒了.我正在开发一个项目,我在同一个ace编辑器中切换多个文档.使用`$ .extend({},getUndoManager())`我能够保存当前的撤消.然后在填充编辑器时,我重置为新的撤消管理器,如果该文档上有现有的撤消管理器,我会将其丢弃.在所有文档中保留我的撤消历史记录,而无需复制ace编辑器. (2认同)

a u*_*ser 7

使用editor.session.setValue()或致电editor.session.getUndoManager().reset();请参阅https://github.com/ajaxorg/ace/blob/v1.1.9/lib/ace/edit_session.js#L279

  • 我建议这里的答案组合:`setTimeout(function() { editor.getSession().getUndoManager().reset(); }, 700);` (3认同)
  • 立即调用reset不起作用,因为超时后更改已添加到undoManager中 (2认同)
  • 只需使用 editor.session.setValue() 即可,设置值后将调用 reset() 。所以不需要使用定时器。 (2认同)