Запоминание истории между сессиями в Inferior Emacs Lisp Mode


9

Я не могу заставить Emacs запомнить историю *ielm*буферов между сессиями. Насколько я могу судить, такая история записана в буферной локальной переменной comint-input-ring. Поэтому я добавил следующее выражение в мой файл инициализации:

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

Не работает Я знаю, что desktopпакет работает, потому что Emacs запоминает глобальные переменные, которые я добавил desktop-globals-to-saveв мой файл инициализации.

-

РЕДАКТИРОВАТЬ: savehistне работает либо. Я полагаю, это потому, что comint-input-ringэто локальная переменная буфера.


1
Сейчас нет времени, чтобы проверить, почему он не может работать на рабочем столе. Но вы можете попробовать использовать savehist.elи добавить эту переменную в список переменных для сохранения.
Дрю

Спасибо, Дрю, но я уже думал 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), что очень полезно, и также научило меня немного больше elisp ... спасибо!
Блейк Миллер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.