28.6 Время модификации буфера

Предположим, вы открыли файл и внесли изменения в его буфер, а тем временем сам файл был изменен на диске. В этом случае сохранение буфера перезапишет изменения в файле. Иногда это может быть то, что вам нужно, но обычно это приведет к потере ценной информации. Поэтому Emacs проверяет время модификации файла с помощью функций, описанных ниже, перед сохранением файла. (См. Атрибуты файла, чтобы узнать, как проверить время модификации файла.)

Функция: verify-visited-file-modtime &optional buffer

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

Функция возвращает t, если последнее фактическое время модификации и записанное Emacs время модификации совпадают, и nil в противном случае. Она также возвращает t, если в буфере не записано последнее время модификации, то есть если visited-file-modtime вернет ноль.

Она всегда возвращает t для буферов, которые не посещают файл, даже если visited-file-modtime возвращает ненулевое значение. Например, она всегда возвращает t для буферов dired. Она возвращает t для буферов, которые посещают файл, которого не существует и никогда не существовало, но nil для буферов, посещающих файл, который был удален.

Функция: clear-visited-file-modtime

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

Эта функция вызывается в set-visited-file-name и в других исключительных местах, где не следует выполнять обычную проверку для предотвращения перезаписи измененного файла.

Функция: visited-file-modtime

Эта функция возвращает записанное в текущем буфере последнее время модификации файла в виде временной метки Lisp (см. Время суток).

Если в буфере не записано последнее время модификации, эта функция возвращает ноль. Такой случай возникает, например, если буфер не посещает файл или если время было явно очищено с помощью clear-visited-file-modtime. Однако следует отметить, что visited-file-modtime возвращает временную метку и для некоторых буферов, не связанных с файлами. Например, в буфере dired, отображающем каталог, она возвращает последнее время модификации этого каталога, записанное dired.

Если буфер посещает файл, которого не существует, эта функция возвращает -1.

Функция: set-visited-file-modtime &optional time

Эта функция обновляет запись в буфере о последнем времени модификации посещаемого файла до значения, указанного в time, если time не равен nil, или до последнего времени модификации посещаемого файла в противном случае.

Если time не является ни nil, ни целочисленным флагом, возвращенным visited-file-modtime, то это должно быть значение времени Lisp (см. Время суток).

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

Функция: ask-user-about-supersession-threat filename

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

В зависимости от ответа пользователя функция может завершиться нормально, в этом случае модификация буфера продолжается, или она может вызвать ошибку file-supersession с данными (filename), в результате чего предложенная модификация буфера не допускается.

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

См. также механизм блокировки файлов в Блокировки файлов.