Spec-Zone.ru › Elisp

Возврат к исходному состоянию

Если вы внесли в файл значительные изменения, а затем передумали, их можно отменить, прочитав предыдущую версию файла с помощью команды 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

Spec-Zone.ru

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