27.2 Автосохранение

Emacs периодически сохраняет все файлы, которые вы просматриваете; это называется автосохранением. Автосохранение предотвращает потерю большого объёма работы в случае сбоя системы. По умолчанию автосохранение происходит каждые 300 нажатий клавиш или примерно через 30 секунд бездействия. См. Автосохранение: защита от катастроф в Руководстве по GNU Emacs для получения информации об автосохранении для пользователей. Здесь мы описываем функции, используемые для реализации автосохранения, и переменные, управляющие ими.

Переменная: buffer-auto-save-file-name

Эта буферно-локальная переменная содержит имя файла, используемого для автосохранения текущего буфера. Она равна nil, если буфер не должен автосохраняться.

buffer-auto-save-file-name
     ⇒ "/xcssun/users/rms/lewis/#backups.texi#"
Команда: auto-save-mode arg

Это команда режима для режима автосохранения, буферно-локального второстепенного режима. Когда режим автосохранения включён, автосохранение включено в буфере. Соглашение о вызове такое же, как и для других команд второстепенных режимов (см. Соглашения для написания второстепенных режимов).

В отличие от большинства второстепенных режимов, переменная auto-save-mode отсутствует. Режим автосохранения включён, если buffer-auto-save-file-name не равен nil, а buffer-saved-size (см. ниже) не равен нулю.

Переменная: auto-save-file-name-transforms

Эта переменная задаёт преобразования, применяемые к имени файла буфера перед формированием имени файла автосохранения.

Каждое преобразование — это список вида (regexp replacement [uniquify]). regexp — это регулярное выражение для сопоставления с именем файла; если оно совпадает, replace-match используется для замены совпавшей части на replacement. Если необязательный элемент uniquify не равен nil, имя файла автосохранения формируется путём объединения части каталога преобразованного имени файла с именем файла буфера, в котором все разделители каталогов заменены на ‘!’ во избежание конфликтов. (Это не будет работать правильно, если ваша файловая система усекает результирующее имя.)

Если uniquify является одним из элементов secure-hash-algorithms, Emacs формирует некаталоговую часть имени файла автосохранения, применяя соответствующий secure-hash к имени файла буфера. Это позволяет избежать риска чрезмерно длинных имён файлов.

Все преобразования в списке пробуются по порядку их перечисления. Когда одно преобразование срабатывает, его результат является окончательным; дальнейшие преобразования не пробуются.

Значение по умолчанию настроено так, чтобы помещать файлы автосохранения удалённых файлов во временный каталог (см. Генерация уникальных имён файлов).

В файловых системах MS-DOS без длинных имён эта переменная всегда игнорируется.

Функция: auto-save-file-name-p filename

Эта функция возвращает не nil, если filename является строкой, которая может быть именем файла автосохранения. Она предполагает обычное соглашение об именовании файлов автосохранения: имя, которое начинается и заканчивается символами решётки (‘#’), является возможным именем файла автосохранения. Аргумент filename не должен содержать часть каталога.

(make-auto-save-file-name)
     ⇒ "/xcssun/users/rms/lewis/#backups.texi#"
(auto-save-file-name-p "#backups.texi#")
     ⇒ 0
(auto-save-file-name-p "backups.texi")
     ⇒ nil
Функция: make-auto-save-file-name

Эта функция возвращает имя файла для автосохранения текущего буфера. Это просто имя файла с добавленными в начало и конец символами решётки (‘#’). Эта функция не учитывает переменную auto-save-visited-file-name (описана ниже); вызывающие эту функцию должны сначала проверить эту переменную.

(make-auto-save-file-name)
     ⇒ "/xcssun/users/rms/lewis/#backups.texi#"
Пользовательская опция: auto-save-visited-file-name

Если эта переменная не равна nil, Emacs автосохраняет буферы в файлах, которые они посещают. То есть автосохранение выполняется в том же файле, который вы редактируете. Обычно эта переменная равна nil, поэтому файлы автосохранения имеют отдельные имена, создаваемые make-auto-save-file-name.

Когда вы изменяете значение этой переменной, новое значение не вступает в силу в существующем буфере до тех пор, пока в нём не будет повторно включён режим автосохранения. Если режим автосохранения уже включён, автосохранения продолжают выполняться в тот же файл, пока auto-save-mode не будет вызвана снова.

Обратите внимание, что установка этой переменной в значение, отличное от nil, не меняет того факта, что автосохранение отличается от сохранения буфера; например, хуки, описанные в Сохранение буферов, не выполняются при автосохранении буфера.

Функция: recent-auto-save-p

Эта функция возвращает t, если текущий буфер был автосохранён с момента последнего чтения или сохранения.

Функция: set-buffer-auto-saved

Эта функция помечает текущий буфер как автосохранённый. Буфер не будет автосохраняться снова, пока текст буфера не будет снова изменён. Функция возвращает nil.

Пользовательская опция: auto-save-interval

Значение этой переменной задаёт, как часто выполнять автосохранение, в терминах количества событий ввода. Каждый раз, когда считывается указанное количество дополнительных событий ввода, Emacs выполняет автосохранение для всех буферов, для которых оно включено. Установка этого значения в ноль отключает автосохранение на основе количества введённых символов.

Пользовательская опция: auto-save-timeout

Значение этой переменной — это количество секунд бездействия, по истечении которых должно выполняться автосохранение. Каждый раз, когда пользователь делает паузу на это время, Emacs выполняет автосохранение для всех буферов, для которых оно включено. (Если текущий буфер велик, указанное время ожидания умножается на коэффициент, возрастающий с увеличением размера; для буфера размером в миллион байт коэффициент составляет почти 4.)

Если значение равно нулю или nil, автосохранение не выполняется в результате бездействия, а только после определённого количества событий ввода, заданного auto-save-interval.

Переменная: auto-save-hook

Этот обычный хук выполняется каждый раз, когда должно произойти автосохранение.

Пользовательская опция: auto-save-default

Если эта переменная не равна nil, буферы, посещающие файлы, по умолчанию имеют включённое автосохранение. В противном случае — нет.

Команда: do-auto-save &optional no-message current-only

Эта функция автосохраняет все буферы, которые нуждаются в автосохранении. Она сохраняет все буферы, для которых включено автосохранение и которые были изменены с момента предыдущего автосохранения.

Если какие-либо буферы автосохраняются, do-auto-save обычно отображает сообщение ‘Выполняется автосохранение...’ в области эхо во время автосохранения. Однако если no-message не равен nil, сообщение подавляется.

Если current-only не равен nil, автосохраняется только текущий буфер.

Функция: delete-auto-save-file-if-necessary &optional force

Эта функция удаляет файл автосохранения текущего буфера, если delete-auto-save-files не равен nil. Она вызывается каждый раз при сохранении буфера.

Если только force не равен nil, эта функция удаляет файл, только если он был записан текущим сеансом Emacs с момента последнего настоящего сохранения.

Пользовательская опция: delete-auto-save-files

Эта переменная используется функцией delete-auto-save-file-if-necessary. Если она не равна nil, Emacs удаляет файлы автосохранения при выполнении настоящего сохранения (в посещаемом файле). Это экономит дисковое пространство и очищает ваш каталог.

Функция: rename-auto-save-file

Эта функция корректирует имя файла автосохранения текущего буфера, если имя посещаемого файла изменилось. Она также переименовывает существующий файл автосохранения, если он был создан в текущем сеансе Emacs. Если имя посещаемого файла не изменилось, эта функция ничего не делает.

Переменная: buffer-saved-size

Значение этой буферно-локальной переменной — это длина текущего буфера на момент его последнего чтения, сохранения или автосохранения. Она используется для обнаружения существенного уменьшения размера и отключения автосохранения в ответ на это.

Если она равна −1, это означает, что автосохранение временно отключено в этом буфере из-за существенного уменьшения размера. Явное сохранение буфера сохраняет положительное значение в этой переменной, тем самым повторно включая автосохранение. Включение или выключение режима автосохранения также обновляет эту переменную, так что существенное уменьшение размера забывается.

Если она равна −2, это означает, что этот буфер должен игнорировать изменения размера буфера; в частности, он не должен временно отключать автосохранение из-за изменений размера буфера.

Переменная: auto-save-list-file-name

Эта переменная (если не равна nil) задаёт файл для записи имён всех файлов автосохранения. Каждый раз, когда Emacs выполняет автосохранение, он записывает две строки в этот файл для каждого буфера, для которого включено автосохранение. Первая строка содержит имя посещаемого файла (она пуста, если у буфера его нет), а вторая — имя файла автосохранения.

При нормальном завершении Emacs удаляет этот файл; если Emacs аварийно завершает работу, вы можете просмотреть этот файл, чтобы найти все файлы автосохранения, которые могут содержать работу, которая в противном случае была бы потеряна. Команда recover-session использует этот файл для их поиска.

Имя этого файла по умолчанию указывает на ваш домашний каталог и начинается с ‘.saves-’. Оно также содержит ID процесса Emacs и имя хоста.

Пользовательская опция: auto-save-list-file-prefix

После чтения вашего init-файла Emacs инициализирует auto-save-list-file-name (если вы ещё не установили его в значение, отличное от nil) на основе этого префикса, добавляя имя хоста и ID процесса. Если вы установите это значение в nil в вашем init-файле, то Emacs не будет инициализировать auto-save-list-file-name.