Можно ли автоматически сохранять временные буферы, которые не посещают файл? - PullRequest
6 голосов
/ 13 января 2012

Предположим, я ввожу кучу текста в буфер, который не посещает файл (это может быть новый пост org2blog или просто какой-нибудь рабочий буфер).Можно ли где-нибудь автоматически сохранить его на случай, если случится катастрофа и Emacs умрет?

Ответы [ 2 ]

12 голосов
/ 13 января 2012

auto-save-mode фактически работает с нефайловыми буферами. По умолчанию он не включается - обычно это происходит в (after-find-file).

Итак: М-х 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 RET ), если auto-save-mode вызывается в интерактивном режиме. Надеемся, что это позволит избежать конфликта с любым другим использованием auto-save-mode с нефайловыми буферами (например, в коде упоминается режим Mail).

(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)
5 голосов
/ 14 января 2012

ответ филса все прояснило для меня, но в итоге я использовал несколько иной подход. Я публикую это как отдельный ответ для документации. Вот мой раздел автосохранения:

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