Spec-Zone.ru › Elisp

Атомные группы изменений

В терминологии баз данных атомное изменение — это неделимое изменение: оно может быть выполнено целиком или полностью провалено, но частичного успеха быть не может. Программа Lisp может выполнять серию изменений в одном или нескольких буферах как атомную группу изменений, что означает, что либо вся серия изменений будет установлена в их буферах, либо в случае ошибки ни одно из них не будет.

Для одного буфера, уже текущего, просто запишите вызов atomic-change-group вокруг кода, который производит изменения, как показано ниже:

(atomic-change-group
  (insert foo)
  (delete-region x y))

Если во время выполнения тела atomic-change-group произойдет ошибка (или другой выход за пределы локальной области), то все изменения в этом буфере, выполненные во время работы тела, будут отменены. Такая группа изменений не влияет на другие буферы — любые такие изменения останутся.

Если вам нужно что-то более сложное, например, сделать изменения в разных буферах, образующих одну атомную группу, вы должны напрямую вызвать функции более низкого уровня, которые использует atomic-change-group.

Функция: prepare-change-group &optional buffer

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

Для использования группы изменений, вы должны ее активировать. Вы должны сделать это до внесения любых изменений в текст buffer.

Функция: activate-change-group handle

Эта функция активирует группу изменений, обозначенную handle.

После активации группы изменений, любые изменения, которые вы вносите в этот буфер, становятся частью группы. После внесения всех необходимых изменений в буфер, вы должны завершить группу изменений. Существует два способа сделать это: вы можете либо принять (и окончательно зафиксировать) все изменения, либо отменить их все.

Функция: accept-change-group handle

Эта функция принимает все изменения в группе изменений, указанной handle, делая их окончательными.

Функция: cancel-change-group handle

Эта функция отменяет и отбрасывает все изменения в группе изменений, указанной handle.

Вы можете сделать так, чтобы некоторые или все изменения в группе изменений рассматривались как единый блок для целей команд undo (см. Отмена), используя undo-amalgamate-change-group.

Функция: undo-amalgamate-change-group

Объединить все изменения, внесенные в группе изменений с момента состояния, определенного handle. Эта функция удаляет все границы отмены между записями отмены изменений с момента состояния, описанного handle. Обычно handle — это дескриптор, возвращенный prepare-change-group, в этом случае все изменения с момента начала группы изменений объединяются в единицу отмены.

Ваш код должен использовать unwind-protect для обеспечения того, что группа всегда завершена. Вызов activate-change-group должен находиться внутри unwind-protect, на случай, если пользователь нажмет C-g сразу после его выполнения. (Это одна из причин, почему prepare-change-group и activate-change-group являются отдельными функциями, потому что обычно вы вызываете prepare-change-group перед началом того unwind-protect.) После завершения группы не используйте дескриптор повторно — в частности, не пытайтесь завершить ту же группу дважды.

Чтобы создать группу изменений для нескольких буферов, вызовите prepare-change-group для каждого буфера, который вы хотите включить, затем используйте nconc для объединения возвращенных значений, как показано ниже:

(nconc (prepare-change-group buffer-1)
       (prepare-change-group buffer-2))

Затем вы можете активировать группу изменений для нескольких буферов одним вызовом activate-change-group, и завершить ее одним вызовом accept-change-group или cancel-change-group.

Вложенное использование нескольких групп изменений для одного буфера работает так, как вы ожидаете. Невложенное использование групп изменений для одного буфера может запутать Emacs, поэтому не допускайте этого; первая группа изменений, которую вы начинаете для любого данного буфера, должна быть последней завершенной.

Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Atomic-Changes.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API