33.10 Сохранение списков отмены

В этом разделе описывается, как включить и отключить информацию об отмене для данного буфера. Также объясняется, как список отмены автоматически усекается, чтобы он не стал слишком большим.

Запись информации об отмене в только что созданном буфере по умолчанию включена; но если имя буфера начинается с пробела, запись отмены изначально отключена. Вы можете явно включить или отключить запись отмены с помощью следующих двух функций или установив buffer-undo-list самостоятельно.

Команда: buffer-enable-undo &optional buffer-or-name

Эта команда включает запись информации об отмене для буфера buffer-or-name, чтобы последующие изменения можно было отменить. Если не указан аргумент, используется текущий буфер. Эта функция ничего не делает, если запись отмены уже включена в буфере. Она возвращает nil.

При интерактивном вызове buffer-or-name — это текущий буфер. Вы не можете указать другой буфер.

Команда: buffer-disable-undo &optional buffer-or-name

Эта функция отбрасывает список отмены buffer-or-name и отключает дальнейшую запись информации об отмене. В результате становится невозможно отменить ни предыдущие, ни последующие изменения. Если список отмены buffer-or-name уже отключен, эта функция не имеет эффекта.

При интерактивном вызове BUFFER-OR-NAME — это текущий буфер. Вы не можете указать другой буфер. Эта функция возвращает nil.

По мере продолжения редактирования списки отмены становятся все длиннее. Чтобы предотвратить использование ими всего доступного объема памяти, сборщик мусора усекает их до установленных вами пределов. (Для этой цели размер списка отмены измеряет ячейки cons, составляющие список, плюс строки удаленного текста.) Три переменные контролируют диапазон допустимых размеров: undo-limit, undo-strong-limit и undo-outer-limit. В этих переменных размер считается как количество занятых байтов, включая как сохраненный текст, так и другие данные.

Пользовательская опция: undo-limit

Это мягкий предел допустимого размера списка отмены. Группа изменений, при которой превышается этот размер, сохраняется последней.

Пользовательская опция: undo-strong-limit

Это верхний предел допустимого размера списка отмены. Группа изменений, при которой превышается этот размер, отбрасывается сама (вместе со всеми более старыми группами изменений). Есть одно исключение: самая последняя группа изменений отбрасывается только в том случае, если она превышает undo-outer-limit.

Пользовательская опция: undo-outer-limit

Если во время сборки мусора информация об отмене для текущей команды превышает этот предел, Emacs отбрасывает информацию и выводит предупреждение. Это крайний предел для предотвращения переполнения памяти.

Пользовательская опция: undo-ask-before-discard

Если эта переменная не равна nil, когда информация об отмене превышает undo-outer-limit, Emacs спрашивает в области эхо, следует ли отбрасывать информацию. Значение по умолчанию — nil, что означает автоматическое отбрасывание.

Эта опция в основном предназначена для отладки. Сборка мусора приостанавливается, пока задается вопрос, что означает, что Emacs может потерять память, если пользователь слишком долго не отвечает.