我在某个地方有文件:
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这样做?
答案 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,但我想你不会问这个问题是不是这样:)方法的优点:
方法的缺点:
.dir-locals.el
另请注意,如果您想要一次性方法,可以使其更简单,例如:
((nil . ((backup-directory-alist (("." . "../path/to/work-directory"))))))
你自己实际计算相对名称,一劳永逸。