在 emacs 中打开文件后(通过 ssh 隧道、sshfs 挂载的文件系统),我得到如下符号链接:
.#jobid.php -> ddh@localhost.localdomain.31678:1260471633
我们已经确定这些是 emacs LOCK 文件。
sshfs 文件系统安装有 follow_symlinks 和 transform_symlinks,但它似乎拒绝通过 readlink 返回链接“文本”,因此 emacs 不会删除它们。
如果您正在寻找文档,Emacs 将这些文件称为文件锁。
您可以直接从 Emacs 访问远程文件,而不是使用 sshfs/FUSE:
C-x C-f /ssh:host.name:/path/to/file RET
以这种方式编辑远程文件时,Emacs 不会创建文件锁定 - 搜索“TRAMP”以获取有关编辑远程文件的更多信息。(不幸的是,我猜 Emacs 无法判断您的 FUSE 挂载点是由远程文件系统支持的,或者在其上创建文件锁是有问题的。)
emacs 使用这些符号链接来防止多个 emacs 实例修改同一个文件。当您保存文件时,符号链接通常会消失,但听起来 fuse-sshfs 正在干扰此过程,因为符号链接的目标不是真正的文件(它不是故意的,但 sshfs 期望它)。
不幸的是,我不知道禁用此功能或强制 emacs 将这些符号链接存储在不同目录中的方法(我不经常使用 emacs,并且在手册中没有找到任何内容),因此您可能只需要定期删除恐怕他们是手动的。
该follow_symlinks
选项强制远程系统上的符号链接显示为实际文件。当符号链接指向远程主机上通过 sshfs 挂载的目录之外的目标时,这很有用,但它打破了 Emacs 的假设,因为当 Emacs 创建符号链接时,它期望相同的路径稍后看起来像符号链接。
但是,您应该能够使远程主机上的所有符号链接正常工作,同时仍然显示为符号链接,方法是使用transform_symlinks
选项(而不是follow_symlinks
)并始终安装远程系统的根目录(而不仅仅是您的主目录或其他东西)。这应该允许 emacs 滥用符号链接作为锁定文件,同时仍然可以访问远程符号链接目标。
这些符号链接是由 Emacs 在缓冲区访问文件时创建的,它们防止两个 Emacs 实例编辑同一个文件(如其他答案中所述)。Emacs 将此称为“冲突检测”。
不幸的是,在 GNU emacs 中防止这种行为的唯一方法是在编译时。源文档描述了如何通过更改标题来做到这一点。
这是因为 lock-buffer 和 unlock-buffer 函数是原语,并且被其他原语调用以创建这些符号链接。在旧版本的 Emacs 中,它们可以在 elisp 中重新定义或消除锯齿,但原语不会注意到这种变化。