假设我在一个没有访问文件的缓冲区中输入了一堆文本(它可能是一个新的org2blog帖子,或者只是一些临时缓冲区)。是否有可能将其自动保存在某处以防万一发生灾难并且Emacs死亡?
答案 0 :(得分:12)
auto-save-mode
实际上适用于非文件缓冲区。它默认情况下不会启用 - 通常发生在(after-find-file)
。
所以: M-x auto-save-mode
RET
默认情况下,自动保存文件将写入缓冲区的default-directory
(或/var/tmp
或~/
,具体取决于写入权限;请参阅 Ch v buffer-auto-save-file-name
RET )在崩溃后可能有点尴尬,因此将其设置为标准可能是一个好主意。
以下内容将确保将这些自动保存文件写入您的主目录(或 Mx customize-variable
RET my-non-file-buffer-auto-save-dir
如果以交互方式调用auto-save-mode
,则返回)。这有望避免与auto-save-mode
与非文件缓冲区的任何其他用法冲突(例如,代码提到了邮件模式)。
(defcustom my-non-file-buffer-auto-save-dir (expand-file-name "~/")
"Directory in which to store auto-save files for non-file buffers,
when `auto-save-mode' is invoked manually.")
(defadvice auto-save-mode (around use-my-non-file-buffer-auto-save-dir)
"Use a standard location for auto-save files for non-file buffers"
(if (and (not buffer-file-name)
(called-interactively-p 'any))
(let ((default-directory my-non-file-buffer-auto-save-dir))
ad-do-it)
ad-do-it))
(ad-activate 'auto-save-mode)
答案 1 :(得分:5)
phils' answer为我解决了问题,但我最终采用了一种不同的方法。为了文档的缘故,我将它作为单独的答案发布。这是我的自动保存节:
;; Put autosave files (ie #foo#) in one place
(defvar autosave-dir (concat "~/.emacs.d/autosave.1"))
(defvar autosave-dir-nonfile (concat "~/.emacs.d/autosave.nonfile"))
(make-directory autosave-dir t)
(make-directory autosave-dir-nonfile t)
(defun auto-save-file-name-p (filename) (string-match "^#.*#$" (file-name-nondirectory filename)))
(defun make-auto-save-file-name ()
(if buffer-file-name (concat autosave-dir "/" "#" (file-name-nondirectory buffer-file-name) "#")
(expand-file-name (concat autosave-dir-nonfile "/" "#%"
(replace-regexp-in-string "[*]\\|/" "" (buffer-name)) "#"))))
在此上下文中,为非访问文件缓冲区创建单独的目录是可选的;他们也可以进入集中位置(在这种情况下,autosave-dir
)。另请注意,如果临时缓冲区名称类似于“* foo / bar *”(带星号和/或斜杠),我必须执行一些基本文件名清理。
最后,可以使用类似
之类的东西自动打开某些模式的临时缓冲区中的自动保存(add-hook 'org2blog/wp-mode-hook '(lambda () (auto-save-mode t)))