Блокировки файлов
Когда два пользователя одновременно редактируют один и тот же файл, они могут помешать друг другу. 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:
- Значение
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
Вы можете предотвратить создание удалённых файлов блокировки, установив переменную
remote-file-name-inhibit-locksв значениеt.
- Команда: lock-file-mode
Эта команда, вызываемая интерактивно, переключает локальное значение
create-lockfilesв текущем буфере.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/File-Locks.html