Когда два пользователя одновременно редактируют один и тот же файл, они, вероятно,
будут мешать друг другу. 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 все равно предупредит пользователя, который сохранит вторым. Кроме того, обнаружение изменения буфера, просматривающего измененный на диске файл, отлавливает некоторые случаи одновременного редактирования; см. Время изменения буфера.
Эта функция возвращает nil, если файл filename
не заблокирован. Она возвращает t, если он заблокирован этим
процессом Emacs, и возвращает имя пользователя, который его заблокировал, если он
заблокирован другой задачей.
(file-locked-p "foo")
⇒ nil
Эта функция блокирует файл filename, если текущий буфер
изменен. Аргумент filename по умолчанию использует просматриваемый
файл текущего буфера. Ничего не происходит, если текущий буфер не просматривает
файл, или не изменен, или если опция create-lockfiles равна
nil.
Эта функция разблокирует файл, просматриваемый в текущем буфере, если
буфер изменен. Если буфер не изменен, то файл не должен быть заблокирован,
поэтому эта функция ничего не делает. Она также ничего не делает, если текущий
буфер не просматривает файл или не заблокирован. Эта функция обрабатывает
ошибки файловой системы, вызывая display-warning, и в
противоположном случае игнорирует ошибку.
Если эта переменная равна nil, Emacs не блокирует файлы.
По умолчанию Emacs создает файлы блокировки в той же директории, что и
файлы, которые блокируются. Это можно изменить, настроив эту
переменную. Она имеет тот же синтаксис, что и
auto-save-file-name-transforms (см. Автосохранение).
Например, чтобы заставить Emacs записывать все файлы блокировки в
/var/tmp/, можно написать что-то вроде:
(setq lock-file-name-transforms
'(("\\`/.*/\\([^/]+\\)\\'" "/var/tmp/\\1" t)))
Эта функция вызывается, когда пользователь пытается изменить file, но он заблокирован другим пользователем с именем other-user. По умолчанию эта функция просит пользователя решить, что делать. Значение, которое возвращает эта функция, определяет, что Emacs сделает дальше:
t означает захват блокировки на файл. Затем
этот пользователь может редактировать файл, и other-user
теряет блокировку.
nil означает игнорирование блокировки и
разрешение этому пользователю редактировать файл в любом случае.
file-locked,
в результате чего изменение, которое пользователь собирался внести, не произойдет.
Сообщение об ошибке для этой ошибки выглядит так:
error→ File is locked: file other-user
где file — это имя файла, а other-user —
имя пользователя, который заблокировал файл.
Если хотите, вы можете заменить функцию ask-user-about-lock
собственной версией, которая примет решение иным способом.
Вы можете предотвратить создание удаленных файлов блокировки,
установив переменную remote-file-name-inhibit-locks в t.
Эта команда, вызываемая интерактивно, переключает локальное значение
create-lockfiles в текущем буфере.