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

时间:2012-09-03 19:29:22

标签: 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这样做?

2 个答案:

答案 0 :(得分:3)

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

我提出的折衷解决方案是在backup-buffer周围安装“建议”,在评估backup-buffer时暂时禁用file-chase-links。这允许备份文件位于符号链接所在的目录中。但是,它还会导致Emacs通过重命名原始符号链接来创建备份,而backup-buffer的符号链接指向work_directory/doc.tex~的符号链接!幸运的是,通过将location_a/doc.tex设置为backup-by-copying可以很容易地将其阻止。

这是代码。一句警告:虽然我已经尝试过验证它是否有效,但我无法保证它不会产生不良副作用,例如上述干扰需要t的备份机制。但是,它也可以正常工作 - 使用它时要小心。

backup-by-copying

答案 1 :(得分:1)

为了好玩,让我根据目录变量描述一种截然不同的方法。

简而言之,您可以在work-directory/中添加一个名为.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设置为nil,但我想你不会问这个问题是不是这样:)

方法的优点:

  • 不需要建议(这总是一件好事)
  • 合理便携,虽然它假定您的Emacs支持目录变量
  • 您可以灵活地将其放置在您需要的地方

方法的缺点:

  • 嗯,显然你可能需要在几个地方复制.dir-locals.el

另请注意,如果您想要一次性方法,可以使其更简单,例如:

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

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