Если вы внесли обширные изменения в файл, а затем передумали, вы можете избавиться от них, загрузив предыдущую версию файла с помощью команды revert-buffer. См. Отмена изменений буфера в Руководство GNU Emacs.
Эта команда заменяет текст буфера текстом файла, который был посещен на диске. Это действие отменяет все изменения, сделанные с момента посещения или сохранения файла.
По умолчанию, если последняя автоматически сохраненная версия новее посещенного файла, и аргумент ignore-auto равен nil, revert-buffer спрашивает пользователя, хочет ли он использовать эту автоматически сохраненную версию. При вызове этой команды интерактивно, ignore-auto равен t, если не указан числовой аргумент; таким образом, интерактивный вариант по умолчанию не проверяет автоматически сохраненный файл.
Обычно revert-buffer запрашивает подтверждение перед изменением буфера; но если аргумент noconfirm не равен nil, revert-buffer не запрашивает подтверждения.
Обычно эта команда повторно инициализирует основные и второстепенные режимы буфера с помощью normal-mode. Но если preserve-modes не равен nil, режимы остаются без изменений.
При отмене изменений сохраняются позиции маркеров в буфере с помощью функции замены insert-file-contents. Если содержимое буфера и содержимое файла идентичны до операции отмены изменений, отмена изменений сохраняет все маркеры. Если они не идентичны, отмена изменений изменяет буфер; в этом случае она сохраняет маркеры в неизмененном тексте (если таковой имеется) в начале и в конце буфера. Сохранение любых дополнительных маркеров было бы проблематичным.
При отмене изменений из нефайловых источников маркеры обычно не сохраняются, но это зависит от конкретной реализации revert-buffer-function.
revert-buffer устанавливает эту переменную в не-nil значение, пока она работает.
Вы можете настроить работу revert-buffer, установив переменные, описанные в остальной части этого раздела.
Эта переменная содержит список файлов, которые должны быть отменены без запроса. Значение представляет собой список регулярных выражений. Если имя посещенного файла соответствует одному из этих регулярных выражений, и файл изменился на диске, но буфер не изменен, то revert-buffer отменяет изменения файла без запроса подтверждения у пользователя.
Некоторые основные режимы настраивают revert-buffer, создавая локальные для буфера привязки для этих переменных:
Значение этой переменной — это функция, используемая для отмены изменений в этом буфере. Это должна быть функция с двумя необязательными аргументами для выполнения работы по отмене изменений. Два необязательных аргумента, ignore-auto и noconfirm, — это аргументы, которые получила revert-buffer.
Режимы, такие как Dired mode, в котором редактируемый текст не состоит из содержимого файла, а может быть восстановлен иным образом, могут присвоить этой переменной локальное для буфера значение, которое является специальной функцией для восстановления содержимого.
Значение этой переменной указывает функцию, используемую для вставки обновленного содержимого при отмене изменений в этом буфере. Функция принимает два аргумента: первый — имя файла для использования; второй — t, если пользователь запросил чтение автоматически сохраненного файла.
Причина, по которой режим изменяет эту переменную вместо revert-buffer-function, заключается в том, чтобы избежать дублирования или замены того, что делает revert-buffer: запрос подтверждения, очистка списка отмены, определение надлежащего основного режима и выполнение хуков, перечисленных ниже.
Этот обычный хук выполняется стандартной revert-buffer-function перед вставкой измененного содержимого. Пользовательская revert-buffer-function может или не может выполнять этот хук.
Этот обычный хук выполняется стандартной revert-buffer-function после вставки измененного содержимого. Пользовательская revert-buffer-function может или не может выполнять этот хук.
Значение этой переменной указывает список функций, которые сохраняют состояние буфера. Перед операцией отмены изменений каждая функция из этого списка вызывается без аргументов, и она должна вернуть лямбду, которая сохраняет определенное состояние (например, состояние только для чтения). После операции отмены изменений каждая лямбда будет вызвана по очереди в порядке списка, и она должна восстановить сохраненное состояние в отмененном буфере.
Emacs может автоматически отменять изменения в буферах. Он делает это по умолчанию для буферов, посещающих файлы. Ниже описано, как добавить поддержку автоматической отмены изменений для новых типов буферов.
Сначала такие буферы должны иметь подходящую revert-buffer-function и buffer-stale-function.
Значение этой переменной указывает функцию, которую следует вызвать для проверки того, нуждается ли буфер в отмене изменений. Значение по умолчанию обрабатывает только буферы, посещающие файлы, проверяя их время модификации. Буферы, не посещающие файлы, требуют пользовательской функции с одним необязательным аргументом noconfirm. Функция должна возвращать не-nil, если буфер должен быть отменен. Буфер находится в текущем состоянии, когда вызывается эта функция.
Хотя эта функция в основном предназначена для использования в автоматической отмене изменений, ее можно использовать и для других целей. Например, если автоматическая отмена изменений отключена, ее можно использовать для предупреждения пользователя о том, что буфер нуждается в отмене изменений. Идея аргумента noconfirm заключается в том, что он должен быть t, если буфер будет отменен без запроса у пользователя, и nil, если функция будет использоваться только для предупреждения пользователя о том, что буфер устарел. В частности, для использования в автоматической отмене изменений noconfirm равно t. Если функция будет использоваться только для автоматической отмены изменений, вы можете игнорировать аргумент noconfirm.
Если вы просто хотите автоматически отменять изменения каждые auto-revert-interval секунд (как в Меню буфера), используйте:
(setq-local buffer-stale-function
(lambda (&optional noconfirm) 'fast))
в функции режима буфера.
Специальное возвращаемое значение «fast» сообщает вызывающей стороне, что необходимость отмены изменений не проверялась, но отмена изменений буфера быстрая. Оно также сообщает Auto Revert не выводить никаких сообщений об отмене изменений, даже если auto-revert-verbose не равен nil. Это важно, поскольку получение сообщений об отмене изменений каждые auto-revert-interval секунд может быть очень раздражающим. Информация, предоставленная этим возвращаемым значением, также может быть полезна, если функция вызывается не для автоматической отмены изменений.
Как только буфер имеет подходящую revert-buffer-function и buffer-stale-function, обычно остаются несколько проблем.
Буфер будет автоматически отменен только в том случае, если он помечен как неизмененный. Следовательно, вам необходимо убедиться, что различные функции помечают буфер как измененный тогда и только тогда, когда буфер содержит информацию, которая может быть утеряна при отмене изменений, или есть причина полагать, что пользователь может быть неудобен из-за автоматической отмены изменений, поскольку он активно работает над буфером. Пользователь всегда может это переопределить, вручную настроив статус изменения буфера. Для поддержки этого вызов revert-buffer-function для буфера, помеченного как неизмененный, всегда должен сохранять буфер в помеченном как неизмененный состоянии.
Важно убедиться, что точка не постоянно перемещается в результате автоматической отмены изменений. Конечно, перемещение точки может быть неизбежным, если буфер радикально меняется.
Вы должны убедиться, что revert-buffer-function не выводит сообщения, которые ненужно дублируют собственные сообщения Auto Revert, отображаемые, если auto-revert-verbose равен t, и эффективно переопределяют значение nil для auto-revert-verbose. Таким образом, адаптация режима для автоматической отмены изменений часто включает в себя устранение таких сообщений. Это особенно важно для буферов, которые автоматически отменяются каждые auto-revert-interval секунд.
Если новая автоматическая отмена изменений является частью Emacs, вы должны упомянуть это в строке документации global-auto-revert-non-file-buffers.
Аналогично, вы должны задокументировать дополнения в руководстве Emacs.