26.5 Блокировки файлов

Когда два пользователя одновременно редактируют один и тот же файл, они, вероятно, будут мешать друг другу. Emacs пытается предотвратить эту ситуацию, регистрируя блокировку файла, когда файл изменяется. Затем Emacs может обнаружить первую попытку изменить буфер, просматривающий файл, заблокированный другой задачей Emacs, и спросить пользователя, что делать. Блокировка файла на самом деле является файлом, символической ссылкой со специальным именем, хранящимся в той же директории, что и редактируемый вами файл. Имя составляется путем добавления .# к имени файла буфера. Цель символической ссылки будет иметь вид user@host.pid:boot, где user заменяется на текущее имя пользователя (из user-login-name), host — на имя хоста, на котором запущен Emacs (из system-name), pid — на идентификатор процесса Emacs, а boot — на время с момента последней перезагрузки. :boot опускается, если время загрузки недоступно. (В файловых системах, не поддерживающих символические ссылки, используется обычный файл с содержимым вида user@host.pid:boot.)

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

Функция: file-locked-p filename

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

(file-locked-p "foo")
     ⇒ nil
Функция: lock-buffer &optional filename

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

Функция: unlock-buffer

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

Пользовательская опция: create-lockfiles

Если эта переменная равна nil, Emacs не блокирует файлы.

Пользовательская опция: lock-file-name-transforms

По умолчанию Emacs создает файлы блокировки в той же директории, что и файлы, которые блокируются. Это можно изменить, настроив эту переменную. Она имеет тот же синтаксис, что и auto-save-file-name-transforms (см. Автосохранение). Например, чтобы заставить Emacs записывать все файлы блокировки в /var/tmp/, можно написать что-то вроде:

(setq lock-file-name-transforms
      '(("\\`/.*/\\([^/]+\\)\\'" "/var/tmp/\\1" t)))
Функция: ask-user-about-lock file other-user

Эта функция вызывается, когда пользователь пытается изменить file, но он заблокирован другим пользователем с именем other-user. По умолчанию эта функция просит пользователя решить, что делать. Значение, которое возвращает эта функция, определяет, что Emacs сделает дальше:

Если хотите, вы можете заменить функцию ask-user-about-lock собственной версией, которая примет решение иным способом.

Пользовательская опция: remote-file-name-inhibit-locks

Вы можете предотвратить создание удаленных файлов блокировки, установив переменную remote-file-name-inhibit-locks в t.

Команда: lock-file-mode

Эта команда, вызываемая интерактивно, переключает локальное значение create-lockfiles в текущем буфере.