如何让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
被设置为零,但我想你不会问这个问题,如果不是这样的话:) 优点:
方法的缺点:
.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?