如何让emacs将其备份文件与符号链接一起保存?

我在某个位置有文件:

location_a/doc.tex
location_a/doc.cls
...

我想通过符号链接在另一个目录中处理它们:

work_directory/doc.tex -> location_a/doc.tex
work_directory/doc.cls -> location_a/doc.cls
work_directory/doc.pdf
work_directory/doc.log
...

但是,当我在工作目录中运行emacs doc.tex并执行一些编辑时,emacs会在location_a/doc.tex~创建一个备份文件。 不过,我希望将备份文件存储在工作目录中。 我不希望在location_a创建任何新文件。

我该如何让emacs做到这一点?


这比看来应该更复杂,因为backup-buffer在调用任何备份文件名称构造机制(比如make-backup-file-name-function之前坚持要追踪缓冲区文件名的链接。 结果是Emacs无法自定义这种行为,缺少重新定义backup-buffer ,这是一段相当复杂的代码。

我想出了一个折中的办法是安装一个“建议”,围绕backup-buffer暂时禁用file-chase-links ,而backup-buffer正在接受评估。 这允许备份文件位于符号链接所在的目录中。 但是,它也会导致Emacs通过重命名原始符号链接来创建备份,而留下一个与work_directory/doc.tex~是指向location_a/doc.tex的符号链接! 幸运的是,通过将backup-by-copying设置为t很容易防止这种情况发生。

这是代码。 一句警告:虽然我已经试图验证它是否有效,但我不能保证它不会产生不良副作用,例如上述干扰需要backup-by-copying的备份机制。 但是,它也可能工作得很好 - 使用它时要小心。

(require 'cl)  ; for flet
(defadvice backup-buffer (around disable-chase-links)
  (flet ((file-chase-links (file) file))
    ad-do-it))
(ad-activate 'backup-buffer)

为了它的乐趣,让我描述一个基于目录变量的完全不同的方法。

简而言之,您将放入work-directory/一个名为.dir-locals.el的文件.dir-locals.el包含:

((nil . ((eval . (set (make-local-variable 'backup-directory-alist)
                      (list (cons "."
                                  (file-relative-name
                                   (file-name-directory (buffer-file-name))
                                   (file-name-directory (file-truename
                                                         (buffer-file-name)))))))))))

它所做的一切就是滥用backup-directory-alist ,并将它的本地版本安装在work-directory/所有文件中。 该本地版本将确保任何备份文件保存在work-directory

为了实现这一点,我们需要两件事情:

  • 有一些像'(("." . "path/to/work-directory/"))作为本地值
  • 确保这条路径是相对于location_a/
  • 第二点的原因是,正如其他地方所指出的,一旦符号链接被解析, backup-buffer的起点确实就是实际文件的位置。 而且我们不能简单地将绝对路径放在不改变备份文件形状的情况下(在备份目录的绝对路径的情况下,备份文件名将对完整路径进行编码,以便不会发生冲突)

    笔记:

  • 您需要确保特定的本地变量记录在safe-local-variable-values 。 由于它是一种通用形式,因此它是一项单一的工作(当你第一次被问到时就打“!”)
  • 这假设find-file-visit-truename被设置为零,但我想你不会问这个问题,如果不是这样的话:)
  • 优点:

  • 不需要建议(这总是一件好事)
  • 尽管它假定您的Emacs支持目录变量,但是可以合理地移植
  • 您可以灵活地将其置于适合您的地方
  • 方法的缺点:

  • 好吧,显然你可能需要在几个地方复制.dir-locals.el
  • 还要注意,如果你想要一次性的方法,你可以简化它,比如:

    ((nil . ((backup-directory-alist (("." . "../path/to/work-directory"))))))
    

    实际上你自己计算相对的名字,一劳永逸。

    链接地址: http://www.djcxy.com/p/38555.html

    上一篇: How do I make emacs save its backup files alongside symbolic links?

    下一篇: Why does emacs create temporary symbolic links for modified files?