是否可以自动保存未访问文件的临时缓冲区?

问题描述:

假设我在没有访问文件的缓冲区中输入一堆文本(它可能是一个新的org2blog文章,或者只是一些临时缓冲区)。是否有可能在发生灾难和Emacs死亡的情况下自动保存它?是否可以自动保存未访问文件的临时缓冲区?

auto-save-mode实际适用于非文件缓冲区。它只是默认不启用 - 通常发生在(after-find-file)

所以:的Mxauto-save-modeRET

默认情况下自动保存的文件将被写入缓冲区的default-directory(或/var/tmp~/,这取决于写权限;看到vbuffer-auto-save-file-nameRET)这可能是一个有点尴尬弄清楚崩溃后,所以设置为标准的东西可能是一个好主意。

下将确保这些自动保存的文件被写入到你的主目录(或M-Xcustomize-variableRETmy-non-file-buffer-auto-save-dirRET),如果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) 
+0

伟大的信息。自动保存模式有点神秘,因为它非常不显眼(这是件好事)。我使用make-auto-save-file-name来控制缓冲区的保存位置,而不是defadvice。 – 2012-01-13 22:15:40

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)))