Spec-Zone.ru › Elisp

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

Когда два пользователя одновременно редактируют один и тот же файл, они могут помешать друг другу. 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API