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.