Отмена
Большинство буферов имеют список отмены, в котором записаны все изменения текста буфера, чтобы их можно было отменить. (Буферы, у которых его нет, обычно являются буферами специального назначения, для которых Emacs предполагает, что отмена изменений не имеет смысла. В частности, запись отмены по умолчанию отключена для всех буферов, имена которых начинаются с пробела; см. Имена буферов.) Все примитивы, изменяющие текст в буфере, автоматически добавляют элементы в начало списка отмены, который хранится в переменной buffer-undo-list.
- Переменная: buffer-undo-list
Значение этой локальной для буфера переменной — список отмены текущего буфера. Значение
tотключает запись информации для отмены.
Ниже перечислены типы элементов, которые могут содержаться в списке отмены:
position-
Элемент этого типа записывает предыдущее значение точки; отмена этого элемента перемещает точку в position. Обычное перемещение курсора не создает записей отмены какого-либо типа, но операции удаления используют такие записи, чтобы сохранить положение точки перед выполнением команды, если повторная вставка удаленного текста при отмене удаления сама по себе не вернет точку в нужное положение. Программы на Lisp, которым необходимо гарантировать правильное восстановление точки при отмене команды, могут явно поместить
(point)вbuffer-undo-list, чтобы записать положение для восстановления. (beg . end)-
Элемент этого типа указывает, как удалить вставленный текст. При вставке текст занимал диапазон от beg до end в буфере.
(text . position)-
Элемент этого типа указывает, как повторно вставить удаленный текст. Сам удаленный текст — это строка text. Место для повторной вставки —
(abs position). Если position положительно, точка находилась в начале удаленного текста, в противном случае — в его конце. Сразу за этим элементом следуют ноль или более элементов вида (marker . adjustment). (t . time-flag)-
Элемент этого типа указывает, что буфер без изменений стал измененным. Значение time-flag, представляющее собой метку времени Lisp, не являющуюся целым числом, обозначает время изменения посещенного файла на момент его последнего посещения или сохранения в том же формате, что и
current-time; см. Время суток. Значение time-flag, равное 0, означает, что буфер не соответствует никакому файлу; значение −1 означает, что посещенный файл ранее не существовал.primitive-undoиспользует эти значения, чтобы определить, следует ли снова пометить буфер как не измененный; это происходит только в том случае, если состояние файла соответствует значению time-flag. (nil property value beg . end)-
Элемент этого типа записывает изменение текстового свойства. Вот как можно отменить это изменение:
(put-text-property beg end property value)
(marker . adjustment)-
Элемент этого типа записывает факт перемещения маркера marker из-за удаления окружающего текста, в результате которого он сместился на adjustment позиций символов. Если положение маркера согласуется с предшествующим ему в списке отмены элементом (text . position), то при отмене этого элемента marker перемещается на adjustment символов назад.
(apply funname . args)-
Это расширяемый элемент отмены, который отменяется вызовом funname с аргументами args.
(apply delta beg end funname . args)-
Это расширяемый элемент отмены, который записывает изменение, ограниченное диапазоном от beg до end и увеличившее размер буфера на delta символов. Оно отменяется вызовом funname с аргументами args.
Элемент этого типа позволяет отмене в пределах области определить, относится ли элемент к этой области.
nilЭтот элемент является границей. Элементы между двумя границами называются группой изменений; обычно каждая группа изменений соответствует одной команде клавиатуры, а команды отмены обычно отменяют целую группу как единое целое.
- Функция: undo-boundary
-
Эта функция помещает в список отмены элемент-границу. Команда отмены останавливается на такой границе, а последующие команды отмены доходят до все более ранних границ. Эта функция возвращает
nil.Явный вызов этой функции полезен для разделения эффектов команды на несколько единиц. Например,
query-replaceвызываетundo-boundaryпосле каждой замены, чтобы пользователь мог отменять замены по одной.Однако в большинстве случаев эта функция вызывается автоматически в подходящий момент.
- Функция: undo-auto-amalgamate
-
Цикл команд редактора автоматически вызывает
undo-boundaryнепосредственно перед выполнением каждой последовательности клавиш, поэтому каждая отмена обычно отменяет эффекты одной команды. Некоторые особые команды объединяются: обычно эти команды вносят небольшие изменения в буферы, поэтому граница вставляется только после каждой 20-й команды, что позволяет отменять изменения группой. По умолчанию командыself-insert-command, которая создает символы ввода с автоматической вставкой (см. Команды вставки для пользователя), иdelete-char, которая удаляет символы (см. Удаление текста), объединяются. Если команда затрагивает содержимое нескольких буферов, например когда функция вpost-command-hookизменяет буфер, отличный отcurrent-buffer, тоundo-boundaryбудет вызвана в каждом из затронутых буферов.Эту функцию можно вызвать перед объединяемой командой. Она удаляет предыдущую
undo-boundary, если была выполнена серия таких вызовов.Максимальное количество изменений, которые можно объединить, задается переменной
amalgamating-undo-limit. Если значение этой переменной равно 1, изменения не объединяются.
Программа на Lisp может объединить серию изменений в одну группу изменений, вызвав undo-amalgamate-change-group (см. Атомарные группы изменений). Обратите внимание, что amalgamating-undo-limit не влияет на группы, создаваемые этой функцией.
- Переменная: undo-auto-current-boundary-timer
Некоторые буферы, например буферы процессов, могут изменяться и тогда, когда команды не выполняются. В таких случаях
undo-boundaryобычно периодически вызывается таймером, указанным в этой переменной. Если присвоить этой переменной значение, отличное отnil, такое поведение будет отключено.
- Переменная: undo-in-progress
Обычно эта переменная имеет значение
nil, но команды отмены связывают ее со значениемt. Это позволяет различным обработчикам изменений определять, что они вызваны для выполнения отмены.
- Функция: primitive-undo count list
-
Это основная функция для отмены элементов списка отмены. Она отменяет первые count элементов list и возвращает оставшуюся часть list.
primitive-undoдобавляет элементы в список отмены буфера при изменении буфера. Чтобы избежать путаницы, команды отмены сохраняют значение списка отмены в начале последовательности операций отмены. Затем операции отмены используют сохраненное значение и обновляют его. Новые элементы, добавленные при отмене, не входят в это сохраненное значение, поэтому они не мешают продолжать отмену.Эта функция не связывает
undo-in-progress.
- Макрос: with-undo-amalgamate body…
Этот макрос удаляет все границы отмены, вставленные во время выполнения body, чтобы его можно было отменить одним шагом.
Некоторые команды после выполнения оставляют область активной таким образом, что это мешает выборочной отмене такой команды. Чтобы undo игнорировала активную область при вызове сразу после такой команды, задайте для свойства undo-inhibit-region символа функции команды значение, отличное от nil. См. Стандартные свойства символов.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Undo.html