Возврат к исходному состоянию
Если вы внесли в файл значительные изменения, а затем передумали, их можно отменить, прочитав предыдущую версию файла с помощью команды revert-buffer. См. Возврат буфера к исходному состоянию в Руководстве по GNU Emacs.
- Команда: revert-buffer &optional ignore-auto noconfirm preserve-modes
-
Эта команда заменяет текст буфера текстом открытого файла на диске. Это действие отменяет все изменения, сделанные после открытия или сохранения файла.
По умолчанию, если последний файл автосохранения новее открытого файла и аргумент 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-in-progress
Во время работы
revert-bufferсвязывает эту переменную со значением, не равнымnil.
Вы можете настроить работу revert-buffer, задав переменные, описанные в оставшейся части этого раздела.
- Пользовательский параметр: revert-without-query
Эта переменная содержит список файлов, которые следует возвращать к исходному состоянию без запроса. Значение представляет собой список регулярных выражений. Если имя открытого файла соответствует одному из этих регулярных выражений, файл на диске изменился, а буфер не изменён,
revert-bufferвозвращает файл к исходному состоянию, не запрашивая подтверждения у пользователя.
Некоторые основные режимы настраивают revert-buffer, задавая для этих переменных привязки на уровне буфера:
- Переменная: revert-buffer-function
-
Значение этой переменной — функция, используемая для возврата данного буфера к исходному состоянию. Это должна быть функция с двумя необязательными аргументами, выполняющая возврат. Этими двумя необязательными аргументами — ignore-auto и noconfirm — являются аргументы, полученные
revert-buffer.Режимы, такие как режим Dired, в которых редактируемый текст не состоит из содержимого файла, а может быть заново создан другим способом, могут задавать для этой переменной локальное значение буфера — специальную функцию для повторного создания содержимого.
- Переменная: revert-buffer-insert-file-contents-function
-
Значение этой переменной указывает функцию, используемую для вставки обновлённого содержимого при возврате буфера к исходному состоянию. Функция получает два аргумента: сначала имя файла, которое следует использовать; затем
t, если пользователь запросил чтение файла автосохранения.Причина, по которой режиму следует изменять эту переменную, а не
revert-buffer-function, состоит в том, чтобы не дублировать и не заменять остальные действияrevert-buffer: запрос подтверждения, очистку списка отмены, определение подходящего основного режима и запуск перечисленных ниже хуков.
- Переменная: before-revert-hook
Этот обычный хук запускается реализацией
revert-buffer-functionпо умолчанию перед вставкой изменённого содержимого. Пользовательская реализацияrevert-buffer-functionможет запускать или не запускать этот хук.
- Переменная: after-revert-hook
Этот обычный хук запускается реализацией
revert-buffer-functionпо умолчанию после вставки изменённого содержимого. Пользовательская реализацияrevert-buffer-functionможет запускать или не запускать этот хук.
- Переменная: revert-buffer-restore-functions
Значение этой переменной задаёт список функций, сохраняющих состояние буфера. Перед возвратом к исходному состоянию каждая функция из этого списка вызывается без аргументов и должна возвращать лямбда-функцию, сохраняющую определённое состояние (например, состояние «только для чтения»). После возврата каждая лямбда-функция вызывается по очереди в порядке списка и должна восстановить сохранённое состояние в буфере.
Emacs может автоматически возвращать буферы к исходному состоянию. По умолчанию это происходит с буферами, открывающими файлы. Ниже описано, как добавить поддержку автоматического возврата к исходному состоянию для новых типов буферов.
Для начала таким буферам необходимо определить подходящие revert-buffer-function и buffer-stale-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 для буфера, помеченного как неизменённый, всегда должен оставлять его помеченным как неизменённый.
Важно не допускать постоянного перемещения точки вследствие автоматического возврата к исходному состоянию. Разумеется, перемещения точки может быть невозможно избежать, если буфер значительно изменился.
- Переменная: auto-revert-buffer-in-progress
Во время работы
auto-revert-bufferсвязывает эту переменную со значением, не равнымnil. Реализацииrevert-buffer-functionосновных режимов могут, например, использовать это для подавления сообщений в режимах Auto Revert.
- Переменная: inhibit-auto-revert-buffers
-
Если текущий буфер входит в эту переменную (список буферов), автоматический возврат к исходному состоянию для него подавляется. Это полезно, если к буферу применяются важные изменения, которые может нарушить неожиданный автоматический возврат. После завершения изменений буфер следует удалить из
inhibit-auto-revert-buffers.Проверка наличия в
inhibit-auto-revert-buffersвыполняется до вызоваbuffer-stale-function; таким образом, тяжёлых проверок в этой функции удаётся избежать.Если автоматический возврат запускается уведомлением о файле, но
inhibit-auto-revert-buffersего блокирует, автоматический возврат произойдёт при следующей проверке изменений буфера, если толькоauto-revert-avoid-pollingне равноnil. См. (emacs)Автоматический возврат к исходному состоянию.
- Макрос: inhibit-auto-revert &rest body
Этот макрос добавляет текущий буфер в
inhibit-auto-revert-buffers, выполняет body, а затем удаляет текущий буфер изinhibit-auto-revert-buffers.
Убедитесь, что revert-buffer-function не выводит сообщения, излишне дублирующие собственные сообщения Auto Revert, которые отображаются, если auto-revert-verbose равно t, и фактически переопределяют значение nil для auto-revert-verbose. Поэтому адаптация режима для автоматического возврата часто требует удаления таких сообщений. Это особенно важно для буферов, которые автоматически возвращаются к исходному состоянию каждые auto-revert-interval секунд.
Если новая функция автоматического возврата входит в состав Emacs, упомяните её в строке документации global-auto-revert-non-file-buffers.
Кроме того, следует описать эти дополнения в руководстве по Emacs.
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/Reverting.html