Zapamiętywanie historii między sesjami w trybie Gorszego Emacsa Lisp

9

Nie mogę zmusić Emacsa do zapamiętania historii *ielm*buforów między sesjami. O ile wiem, taka historia jest zapisywana w zmiennej lokalnej bufora comint-input-ring. Dlatego dodałem następujące wyrażenie do mojego pliku init:

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

To nie działa Wiem, że desktoppakiet działa, ponieważ Emacs pamięta zmienne globalne, które dodałem desktop-globals-to-savew moim pliku init.

-

EDYCJA: savehistteż nie działa. Przypuszczam, że to dlatego, że jest comint-input-ringzmienną lokalną dla bufora.

Elena
źródło
1
Nie ma teraz czasu, aby sprawdzić, dlaczego może nie działać na komputerze. Możesz jednak spróbować użyć savehist.eltej zmiennej i dodać ją do listy zmiennych, aby zapisać.
Drew
Dzięki, Drew, ale savehistjuż o tym myślałem (przepraszam, że o tym nie wspominałem). O ile mogłem zobaczyć, dotyczyło to tylko zmiennych globalnych, podczas gdy comint-input-ringjest to bufor lokalny. Teraz i tak spróbowałem, bez powodzenia.
Elena,
OSTRZEŻENIE: Poniższe rozwiązanie jest bluźnierstwem !!!! Skomentuj wewnątrz comint.elnastępujących dwóch wierszy kodu: (put 'comint-input-ring 'permanent-local t)i (make-local-variable 'comint-input-ring). Następnie dodaj comint-input-ringdo desktop-locals-to-save. Na koniec ponownie skompiluj odpowiednie pliki, uruchom ponownie Emacsa i ciesz się pełnią życia.
prawnik

Odpowiedzi:

5

Możesz zapisać lokalną wartość bufora comint-input-ringw zmiennej globalnej po *ielm*zabiciu bufora i przywrócić go w 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)

Teraz powinieneś być w stanie dodać ielm-comint-input-ringdo savehist-additional-variablesuzyskać żądane zachowanie. (Przetestowałem to podejście; jednak powinieneś być w stanie również użyć desktop-locals-to-save.)

Konstantyn
źródło
1
Należy użyć LOCALargumentu add-hook, zamiast ręcznie dzwoniąc make-local-variablena kill-buffer-hook. Ten ostatni może powodować problemy przy późniejszej globalnej próbie dodawania wywołań zwrotnych.
phils
Z przyjemnością stwierdziłem, że to również zadziałało inf-mongo(lub, prawdopodobnie, jakikolwiek inny tryb, który używa comint) Jest to bardzo pomocne, a także nauczyło mnie trochę więcej elisp ... dzięki!
Blake Miller,