Подтвердить что ты не робот

Есть ли способ, чтобы Emacs сохранял вашу историю отмены между сеансами?

Есть ли способ, чтобы EMACS сохранял историю отмены между сеансами?

Я знаю об альбоме savehist, папке saveplace, настольной библиотеке и библиотеке Windows, все они обеспечивают некоторый контроль сеанса, но ни один из них не сохраняет историю отмены.

4b9b3361

Ответ 1

Вот код, который я написал, который, кажется, делает трюк. Он не является пуленепробиваемым, так как он не обрабатывает все тонкости обработки файлов, которые Emacs делает (например, переопределение, где хранятся файлы автосохранения, обработка символических ссылок и т.д.). Но, похоже, это трюк для некоторых простых текстовых файлов, которыми я манипулировал.

(defun save-undo-filename (orig-name)
  "given a filename return the file name in which to save the undo list"
  (concat (file-name-directory orig-name)
          "."
          (file-name-nondirectory orig-name)
          ".undo"))

(defun save-undo-list ()
  "Save the undo list to a file"
  (save-excursion
    (ignore-errors
      (let ((undo-to-save `(setq buffer-undo-list ',buffer-undo-list))
            (undo-file-name (save-undo-filename (buffer-file-name))))
        (find-file undo-file-name)
        (erase-buffer)
        (let (print-level
              print-length)
          (print undo-to-save (current-buffer)))
        (let ((write-file-hooks (remove 'save-undo-list write-file-hooks)))
          (save-buffer))
        (kill-buffer))))
  nil)

(defvar handling-undo-saving nil)

(defun load-undo-list ()
  "load the undo list if appropriate"
  (ignore-errors
    (when (and
           (not handling-undo-saving)
           (null buffer-undo-list)
           (file-exists-p (save-undo-filename (buffer-file-name))))
      (let* ((handling-undo-saving t)
             (undo-buffer-to-eval (find-file-noselect (save-undo-filename (buffer-file-name)))))
        (eval (read undo-buffer-to-eval))))))

(add-hook 'write-file-hooks 'save-undo-list)
(add-hook 'find-file-hook 'load-undo-list)

Ответ 2

Начиная с версии 0.4, дерево отмены поддерживает постоянное хранение данных дерева отмены между сеансами "из коробки". (Обратите внимание, что есть существенные исправления ошибок, связанные с этой функцией в более поздних версиях; последняя версия на момент написания статьи была 0.6.3.)

Просто включите параметр настройки " undo-tree-auto-save-history чтобы автоматически сохранять и загружать историю отмен в буферах отмены дерева. Или используйте команды undo-tree-save/load-history чтобы сохранить и загрузить историю отмен вручную.

Вам нужна по крайней мере Emacs версии 24.3, чтобы это работало надежно, но с достаточно недавним Emacs это работает очень хорошо.

Ответ 3

Добавьте в файл .emacs следующее:

(global-undo-tree-mode)
(setq undo-tree-auto-save-history t)
(setq undo-tree-history-directory-alist '(("." . "~/.emacs.d/undo")))

Объяснение

  • (global-undo-tree-mode) позволяет отменить дерево.

  • (setq undo-tree-auto-save-history t) позволяет автоматически сохранять историю отмены.

  • (setq undo-tree-history-directory-alist '(("." . "~/.emacs.d/undo"))), чтобы ваш проект не засорялся с помощью save файлов с отменой истории.

Ответ 4

desktop-save-mode по умолчанию не сохраняет буфер-список отмены. Вы просто должны сказать ему!

(add-to-list 'desktop-locals-to-save 'buffer-undo-list)

Ответ 5

Сессия Emacs поддерживает следующее:

(add-to-list 'session-locals-include 'buffer-undo-list)

Ответ 6

Мне удалось заставить работать историю отмен, используя информацию, представленную здесь: http://emacs.stackexchange.com/q/3725/2287

Вместо исправления исходного файла desktop.el.gz я создал совет, который временно переопределяет (buffer-local-variables) затем использую его вместе с функцией, которая собирает информацию о буфере.

(defun +append-buffer-undo-list-to-buffer-local-variables-advice (orig-fn &rest args)
  "Override 'buffer-local-variables' and call ORIG-FN with ARGS.
There is a bug in Emacs where the 'buffer-undo-list' data is
missing from the output of 'buffer-local-variables'. This
advice temporarily overrides the function and appends the
missing data."
  (let ((orig-buffer-local-variables-fn (symbol-function 'buffer-local-variables)))
    (cl-letf (((symbol-function 'buffer-local-variables)
               #'(lambda () (append (funcall orig-buffer-local-variables-fn)
                               '(,(cons 'buffer-undo-list buffer-undo-list))))))
      (apply orig-fn args))))

(advice-add #'desktop-buffer-info :around #'+append-buffer-undo-list-to-buffer-local-variables-advice)
(push 'buffer-undo-list desktop-locals-to-save)
(desktop-save-mode 1)

Я надеюсь, что это помогает кому-то еще.