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.


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 ).


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.