Recordando el historial entre sesiones en el modo Emacs Lisp inferior

9

No puedo hacer que Emacs recuerde el historial de *ielm*buffers entre sesiones. Por lo que puedo decir, dicha historia se registra en la variable local del búfer comint-input-ring. Por lo tanto, he agregado la siguiente expresión a mi archivo init:

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

No funciona Sé que el desktoppaquete está funcionando porque Emacs recuerda las variables globales que he agregado desktop-globals-to-saveen mi archivo de inicio.

-

EDITAR: savehisttampoco funciona. Supongo que es porque comint-input-ringes una variable local de búfer.

Elena
fuente
1
No hay tiempo ahora para comprobar por qué podría no funcionar para el escritorio. Pero puede intentar usar savehist.ely agregar esta variable a la lista de variables para guardar.
Dibujó el
Gracias, Drew, pero ya lo había pensado savehist(perdón por no mencionarlo). Por lo que pude ver, fue solo para variables globales, mientras que comint-input-ringes local de búfer. Ahora, lo he intentado de todos modos, sin éxito.
Elena
ADVERTENCIA: ¡La siguiente solución es blasfemia ! Comente dentro de comint.ellas siguientes dos líneas de código: (put 'comint-input-ring 'permanent-local t)y (make-local-variable 'comint-input-ring). Luego, agregue comint-input-ringa desktop-locals-to-save. Finalmente, vuelva a compilar los archivos correspondientes, reinicie Emacs y disfrute de la vida al máximo.
leyes el

Respuestas:

5

Puede guardar el valor local del búfer comint-input-ringen una variable global cuando se *ielm*elimina un búfer y restaurarlo en 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)

Ahora debería poder agregar ielm-comint-input-ringa savehist-additional-variablespara obtener el comportamiento que desea. (Probé este enfoque; desktop-locals-to-saveaunque también deberías poder usarlo ).

Constantina
fuente
1
Debe utilizar el LOCALargumento de que add-hook, en lugar de llamar manualmente make-local-variableen kill-buffer-hook. Esto último podría causar problemas al intentar agregar devoluciones de llamada al gancho a nivel mundial.
phils
Me complació mucho descubrir que esto también funcionó inf-mongo(o, presumiblemente, cualquier otro modo que use comint). Eso es muy útil, y también me enseñó un poco más de elisp ... ¡gracias!
Blake Miller