当两名用户同时编辑同一个文件时,很可能会互相干扰。Emacs 会在文件被修改时记录一个文件锁,以此避免这种情况发生。
Emacs 能够在首次尝试修改被其他 Emacs 进程锁定的文件所对应的缓冲区时检测到冲突,并询问用户如何处理。
文件锁本质上是一个文件,即一个具有特殊名称的符号链接,存放在你正在编辑的文件所在目录中。其命名规则是在缓冲区对应的文件名前添加 .#。
该符号链接的目标格式为 user@host.pid:boot,其中 user 为当前用户名(取自 user-login-name),host 为运行 Emacs 的主机名(取自 system-name),pid 为 Emacs 进程 ID,boot 为系统上次启动以来的时间。若无法获取启动时间,则省略 :boot。(在不支持符号链接的文件系统上,会改用普通文件实现,内容格式同上。)
使用 NFS 访问文件时,存在极小概率会出现你与另一名用户同时为同一个文件加锁的情况。 即便发生这种情况,两人仍可同时修改文件,但 Emacs 仍会对后保存的用户发出警告。 此外,检测缓冲区所访问的文件在磁盘上已被修改的机制也能发现部分同时编辑的情形,详见 Buffer Modification Time。
若文件 filename 未被锁定,该函数返回 nil。若被当前 Emacs 进程锁定则返回 t,若被其他进程锁定则返回持有锁的用户名。
(file-locked-p "foo")
⇒ nil
若当前缓冲区已被修改,该函数会为文件 filename 加锁。参数 filename 默认为当前缓冲区所访问的文件。若当前缓冲区未访问任何文件、未被修改,或选项 create-lockfiles 为 nil,则不执行任何操作。
该函数为当前缓冲区所访问的文件解锁,前提是缓冲区已被修改。若缓冲区未被修改,则文件本不应加锁,函数不执行任何操作。若当前缓冲区未访问文件或文件未被锁定,同样不执行操作。
该函数会通过调用 display-warning 处理文件系统错误,除此之外忽略该错误。
若该变量为 nil,Emacs 不会为文件加锁。
默认情况下,Emacs 在被锁定文件所在的同一目录下创建锁文件。可通过自定义该变量修改这一行为。其语法与 auto-save-file-name-transforms 相同(see 自动保存)。例如,若想让 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 的局部值。