Erinnern an den Verlauf zwischen Sitzungen im Lisp-Modus von Inferior Emacs


9

Ich kann Emacs nicht dazu bringen, sich an den Verlauf der *ielm*Puffer zwischen den Sitzungen zu erinnern . Soweit ich das beurteilen kann, wird ein solcher Verlauf in der pufferlokalen Variablen aufgezeichnet comint-input-ring. Daher habe ich meiner Init-Datei den folgenden Ausdruck hinzugefügt:

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

Es funktioniert nicht. Ich weiß, dass das desktopPaket funktioniert, da Emacs sich an die globalen Variablen erinnert, die ich desktop-globals-to-savein meiner Init-Datei hinzugefügt habe.

- -

EDIT: savehistfunktioniert auch nicht. Ich nehme an, das liegt daran, dass es sich comint-input-ringum eine pufferlokale Variable handelt.


1
Keine Zeit mehr, um zu überprüfen, warum es für den Desktop möglicherweise nicht funktioniert. Sie können jedoch versuchen, savehist.eldiese Variable zu verwenden und zur Liste der zu speichernden Variablen hinzuzufügen.
— Drew

Danke, Drew, aber ich hatte schon darüber nachgedacht savehist(Entschuldigung , dass ich es nicht erwähnt habe). Soweit ich sehen konnte, war es nur für globale Variablen, während comint-input-ringes pufferlokal ist. Jetzt habe ich es trotzdem versucht, ohne Erfolg.
— Elena

WARNUNG: Die folgende Lösung ist Blasphemie !!!! Kommentieren Sie in comint.elden folgenden zwei Codezeilen aus: (put 'comint-input-ring 'permanent-local t)und (make-local-variable 'comint-input-ring). Dann hinzufügen comint-input-ringzu desktop-locals-to-save. Zum Schluss kompilieren Sie die entsprechenden Dateien erneut, starten Sie Emacs neu und genießen Sie das Leben in vollen Zügen.
— Lawlist

Antworten:


5

Sie können den pufferlokalen Wert von comint-input-ringin einer globalen Variablen speichern , wenn ein *ielm*Puffer beendet wird, und ihn wiederherstellen in 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)

Nun sollten Sie in der Lage sein , zu addieren , ielm-comint-input-ringum savehist-additional-variablesdas gewünschte Verhalten zu erhalten. (Ich habe diesen Ansatz getestet. Sie sollten ihn jedoch auch verwenden desktop-locals-to-savekönnen.)


1
Sie sollten das nutzen LOCALArgument add-hook, anstatt manuell Aufruf make-local-variableauf kill-buffer-hook. Letzteres kann zu Problemen führen, wenn anschließend versucht wird, dem Hook global Rückrufe hinzuzufügen.
— Phils

Ich war sehr erfreut zu sehen, dass dies auch für inf-mongo(oder vermutlich für jeden anderen Modus, der verwendet comint) funktioniert. Das ist so hilfreich und hat mir auch ein bisschen mehr Elisp beigebracht ... danke!
— Blake Miller
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.