Отмена
Большинство буферов имеют список отмены, который записывает все изменения, внесённые в текст буфера, чтобы их можно было отменить. (Буферы, у которых его нет, обычно предназначены для специальных задач, для которых Emacs предполагает, что отмена не полезна. В частности, у любого буфера, имя которого начинается с пробела, запись отмены отключена по умолчанию; см. Имена буферов.) Все примитивы, которые изменяют текст в буфере, автоматически добавляют элементы в начало списка отмены, который находится в переменной buffer-undo-list.
- Переменная: buffer-undo-list
Значение этой переменной, локальной для буфера, является списком отмены текущего буфера. Значение
tотключает запись информации об отмене.
Вот какие элементы могут содержать список отмены:
position-
Этот вид элемента записывает предыдущее значение точки; отмена этого элемента перемещает точку в position. Обычные движения курсора не создают записи отмены, но операции удаления используют эти записи для регистрации положения точки перед выполнением команды.
(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.
Некоторые команды оставляют регион активным после выполнения таким образом, что это мешает выборочной отмене этой команды. Чтобы заставить undo игнорировать активный регион при вызове сразу после такой команды, установите свойство undo-inhibit-region символа функции команды в ненулевое значение. См. Стандартные свойства.
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/Undo.html