Запам'ятовування історії між сеансами в режимі Inferior Emacs Lisp


9

Я не можу змусити Emacs пам’ятати історію *ielm*буферів між сесіями. Наскільки я можу сказати, така історія записується в буферно-локальну змінну comint-input-ring. Тому я додав такий вираз у свій файл init:

(setq desktop-locals-to-save
    (append desktop-locals-to-save
            '((comint-input-ring . 50))))

Це не працює. Я знаю, що desktopпакет працює, тому що Emacs запам'ятовує глобальні змінні, які я додав desktop-globals-to-saveу свій файл init.

-

EDIT: savehistтакож не працює. Я припускаю, що це тому comint-input-ring, що це локальна буферна змінна.


1
Зараз немає часу, щоб перевірити, чому це може не працювати на робочому столі. Але ви можете спробувати використати savehist.elта додати цю змінну до списку vars для збереження.
Дрю

Дякую, Дрю, але я вже думав про це savehist(вибачте, що не згадав про це). Наскільки я міг бачити, це було лише для глобальних змінних, в той час comint-input-ringяк локально-буферне. Тепер я спробував це все одно, без успіху.
Олена

Попередження: Наступне рішення - богохульство !!!! Прокоментуйте всередині comint.elнаступних двох рядків коду: (put 'comint-input-ring 'permanent-local t)і (make-local-variable 'comint-input-ring). Потім додайте comint-input-ringдо desktop-locals-to-save. Нарешті, повторно байт-компілюйте відповідні файли, перезавантажте Emacs та насолоджуйтесь живим життям якнайкраще.
законник

Відповіді:


5

Ви можете зберегти локальне значення буфера comint-input-ringв глобальній змінній, коли *ielm*буфер знищено, і відновити його в inferior-emacs-lisp-mode-hook:

;; global copy of the buffer-local variable
(defvar ielm-comint-input-ring nil)

(defun set-ielm-comint-input-ring ()
  ;; create a buffer-local binding of kill-buffer-hook
  (make-local-variable 'kill-buffer-hook)
  ;; save the value of comint-input-ring when this buffer is killed
  (add-hook 'kill-buffer-hook #'save-ielm-comint-input-ring)
  ;; restore saved value (if available)
  (when ielm-comint-input-ring
    (message "Restoring comint-input-ring...")
    (setq comint-input-ring ielm-comint-input-ring)))

(defun save-ielm-comint-input-ring ()
  (message "Saving comint-input-ring...")
  (setq ielm-comint-input-ring comint-input-ring))

(require 'ielm)
(add-hook 'inferior-emacs-lisp-mode-hook #'set-ielm-comint-input-ring)

Тепер ви повинні мати можливість додавати ielm-comint-input-ringдо savehist-additional-variablesотримати поведінку , яке ви хочете. (Я перевірив такий підхід; ви також можете використовувати його desktop-locals-to-save.)


1
Ви повинні використовувати LOCALаргумент add-hook, а не вручну виклику make-local-variableна kill-buffer-hook. Останнє може спричинити проблеми при подальшій спробі додати зворотній зв'язок на гачок у всьому світі.
філс

Мені було дуже приємно виявити, що це працює і для цього inf-mongo(або, мабуть, будь-який інший режим, який використовує comint). Це дуже корисно, а також навчило мене трохи більше елісп ... дякую!
Блейк Міллер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.