Запам'ятовування історії між сеансами в режимі 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.