Сбросить стек отмены в редакторе ACE

Я хочу сбросить стек отмены в редакторе ACE. Поведение должно быть:

  1. Я делаю некоторые изменения в редакторе.
  2. Вызовите какую-нибудь волшебную функцию, чтобы сбросить стек отмены
  3. При попытке отменить это будет невозможно, поскольку стек отмены был сброшен.

Я предполагаю, что это связано с UndoManager от ACE, но я понятия не имею, как я могу использовать его в следующий пример.

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, чтобы найти вспомогательную функцию, но безуспешно.


person Ionică Bizău    schedule 22.06.2015    source источник


Ответы (2)


Да, 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);
#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>

person skbly7    schedule 22.06.2015
comment
Но теперь я ничего не могу нажать CTRL + Z. - person Ionică Bizău; 22.06.2015
comment
Да, это было требование, я думаю? или вы просто хотите удалить последнее изменение, которое произошло с помощью JavaScript? Просьба уточнить... - person skbly7; 22.06.2015
comment
Я хочу сбросить все до этого момента, но после этого я хочу иметь возможность использовать отмену. - person Ionică Bizău; 22.06.2015
comment
Ой ! Извините, это моя ошибка. Я удалил UndoManager, но забыл инициализировать UndoManager новым. Пожалуйста, проверьте обновленный ответ. Надеюсь это поможет... - person skbly7; 22.06.2015
comment
Вместо создания нового диспетчера отмены вы можете просто вызвать функцию getUndoManager().reset(). Пока вы делаете это внутри вызова setTimeout(), вы получаете тот же результат. Кроме того, я установил тайм-аут на 700 мс. - person Kimball Robinson; 08.12.2016
comment
Это круто. Я работаю над проектом, в котором у меня есть несколько документов, между которыми я переключаюсь в одном и том же редакторе ace. Используя $.extend({}, getUndoManager()), я могу сохранить текущие отмены. А затем, когда заполняю редактор, я сбрасываю на новый диспетчер отмен, и если в этом документе есть существующий менеджер отмен, я добавляю его вместо этого. Сохраняет мою историю отмен во всех документах без дублирования редакторов ace. - person Nieminen; 07.09.2017

используйте editor.session.setValue() или вызовите editor.session.getUndoManager().reset(); см. https://github.com/ajaxorg/ace/blob/v1.1.9/lib/ace/edit_session.js#L279

person a user    schedule 22.06.2015
comment
Хм, я пробовал использовать метод reset(), но не работает, почему? - person Ionică Bizău; 22.06.2015
comment
Поскольку похоже, что editor.session.getUndoManager() возвращает конструктор для undoManger, он возвращает функцию: function() {this.reset()} - person Kfir Erez; 04.07.2016
comment
немедленный вызов сброса не работает, потому что изменения добавляются в undoManager после тайм-аута - person a user; 04.07.2016
comment
Я предлагаю комбинацию ответов здесь: setTimeout(function() { editor.getSession().getUndoManager().reset(); }, 700); - person Kimball Robinson; 08.12.2016
comment
Просто используйте editor.session.setValue(), и reset() будет вызываться после установки значений. Так что нет необходимости использовать таймеры. - person Maksim Maksimov; 30.01.2017