我喜欢 emacs,但有些事情一直困扰着我。当我通过 trapmp 编辑文件时,我似乎无法让 emacs 存储文件的本地备份。
目前,当我编辑本地文件时,一组旧版本存储在 /tmp/myusername/emacs_backup 文件夹中。但是,当我通过 trapmp 进行 FTPing 时,旧版本不会存储在那里(我认为它正在尝试远程存储它们?)。
这是我的 .emacs 设置:
(defvar user-temporary-file-directory
(concat "/tmp/" user-login-name "/emacs_backup/"))
(make-directory user-temporary-file-directory t)
(setq make-backup-files t)
(setq backup-by-copying t)
(setq version-control t)
(setq delete-old-versions t)
(setq kept-new-versions 10)
(setq backup-directory-alist `(("." . ,user-temporary-file-directory)))
(setq tramp-backup-directory-alist backup-directory-alist)
(setq tramp-auto-save-directory user-temporary-file-directory)
(setq auto-save-list-file-prefix
(concat user-temporary-file-directory ".auto-saves-"))
(setq auto-save-file-name-transforms
`((".*" ,user-temporary-file-directory t)))
我不在乎 trapsu 编辑是否也存储在 tmp 文件夹中 - 我认为越多越好。非常感谢任何帮助!
tramp-backup-directory-alist
的文档说
(setq 临时备份目录列表备份目录列表)
为主机上的 TRAMP 文件提供与本地文件策略相同的备份策略。
我将其解释为备份远程计算机(“他们的主机”)上的临时文件。查看
tramp.el
中的实现,这也是默认实现(如果未设置 tramp-backup-directory-alist
,则设置 backup-directory-alist
)。
Tramp 假设远程文件的备份也应该始终是远程的,并在备份之前显式地预先添加方法/用户/主机位。如果您想更改行为,我认为您必须建议
tramp-handle-find-backup-file-name
调整文件名(因此它是有效的本地文件名)并与 backup-directory-alist
中的条目协调。
FWIW:从长远来看,将备份放在临时文件目录中并没有多大帮助。 “临时”有点违背了备份的目的。
我还尝试在本地存储备份。我提交了 bug,因为我认为
tramp-backup-directory-alist
已损坏。在与 Michael Albinus 交谈后,我发现我误解了tramp-backup-directory-alist
,这是一种存储远程文件的远程备份的方式,而我应该这样做:
(add-to-list 'backup-directory-alist
(cons tramp-file-name-regexp "/my/local/backup/"))
我能够找到一个解决方法(我尝试通过tramp-backup-directory-alist进行设置 - 但显然有一个tramp能够在本地保存远程缓冲区)。我没有使用内置备份,而是找到了名为 backup-each-save.el 的 elisp 脚本,由 Benjamin Rutt 编写。
重新定义
trump-handle-find-backup-file-name
对我有用。它摆脱了想要在远程服务器上保存备份的行为。
(defun tramp-handle-find-backup-file-name (filename)
"Like `find-backup-file-name' for Tramp files."
(with-parsed-tramp-file-name filename nil
(tramp-run-real-handler 'find-backup-file-name (list filename))))
Tl;dr:我有以下设置,Tramp 将远程文件备份到我的本地目录。
(setq backup-directory-alist '(("." . "~/.emacs.d/tmp")))
(setq tramp-backup-directory-alist nil)
说明:
根据Tramp 2.6.1.5的实现,
(let ((backup-directory-alist
(if tramp-backup-directory-alist
(mapcar
(lambda (x)
(cons
(car x)
(if (and (stringp (cdr x))
(file-name-absolute-p (cdr x))
(not (tramp-tramp-file-p (cdr x))))
(tramp-make-tramp-file-name v (cdr x))
(cdr x))))
tramp-backup-directory-alist)
backup-directory-alist))
result)
...
)
这里的逻辑是这样的
如果设置了
tramp-backup-directory-alist
,则tramp会尝试将tramp文件前缀(即host/user/...)附加到每个备份目录(如果该目录满足三个条件):
否则,无需修改即可使用
backup-directory-alist
。