1

我在某个位置有文件:

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做到这一点?

4

2 回答 2

3

这比看起来应该的要棘手,因为在调用任何备份文件名构造机制之前backup-buffer,它坚持追逐缓冲区文件名的链接,例如. 结果是 Emacs 不允许自定义这种行为,除非重新定义,这是一段相当复杂的代码。make-backup-file-name-functionbackup-buffer

我想出的一个折衷解决方案是安装一个“建议” ,在评估时backup-buffer暂时禁用它。这允许备份文件位于符号链接所在的目录中。但是,它也会导致 Emacs 通过重命名原始符号链接来创建备份,留下一个符号链接指向! 幸运的是,这很容易通过设置为来防止。file-chase-linksbackup-bufferwork_directory/doc.tex~location_a/doc.texbackup-by-copyingt

这是代码。一个警告:虽然我已经尝试过它来验证它是否有效,但我不能保证它不会产生不良副作用,例如上述对所需的备份机制的干扰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)
于 2012-09-04T21:34:54.493 回答
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"))))))

您实际上在其中一劳永逸地自己计算相对名称。

于 2012-09-08T11:30:56.873 回答