Se souvenir de l'historique entre les sessions en mode Lisp Emacs inférieur


9

Je ne peux pas faire en sorte qu'Emacs se souvienne de l'historique des *ielm*tampons entre les sessions. Pour autant que je sache, cet historique est enregistré dans la variable buffer-local comint-input-ring. J'ai donc ajouté l'expression suivante à mon fichier init:

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

Ça ne marche pas. Je sais que le desktoppackage fonctionne car Emacs se souvient des variables globales auxquelles j'ai ajouté desktop-globals-to-savedans mon fichier init.

-

EDIT: savehistne fonctionne pas non plus. Je suppose que c'est parce que comint-input-ringc'est une variable tampon locale.


1
Pas le temps maintenant de vérifier pourquoi cela pourrait ne pas fonctionner pour le bureau. Mais vous pouvez essayer d'utiliser savehist.elet d'ajouter cette variable à la liste des variables à enregistrer.
Drew

Merci, Drew, mais j'avais déjà pensé savehist(désolé de ne pas l'avoir mentionné). Pour autant que je sache, c'était uniquement pour les variables globales, tandis que le comint-input-ringtampon est local. Maintenant, je l'ai essayé de toute façon, sans succès.
Elena

AVERTISSEMENT: La solution suivante est un blasphème !!!! Mettez en commentaire comint.elles deux lignes de code suivantes: (put 'comint-input-ring 'permanent-local t)et (make-local-variable 'comint-input-ring). Ensuite, ajoutez comint-input-ringà desktop-locals-to-save. Enfin, recompilez les fichiers applicables, redémarrez Emacs et profitez pleinement de la vie.
Lawlist

Réponses:


5

Vous pouvez enregistrer la valeur locale du tampon de comint-input-ringdans une variable globale lorsqu'un *ielm*tampon est tué et le restaurer dans 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)

Vous devriez maintenant pouvoir ajouter ielm-comint-input-ringà savehist-additional-variablespour obtenir le comportement que vous souhaitez. (J'ai testé cette approche; vous devriez cependant pouvoir l'utiliser desktop-locals-to-saveégalement.)


1
Vous devez utiliser l' LOCALargument add-hook, plutôt que d' appeler manuellement make-local-variablesur kill-buffer-hook. Ce dernier pourrait provoquer des problèmes lors de la tentative ultérieure d'ajout de rappels au crochet globalement.
phils

J'ai été très heureux de constater que cela fonctionnait inf-mongoaussi bien (ou, probablement, tout autre mode qui utilise comint) C'est tellement utile, et m'a également appris un peu plus éloquent ... merci!
Blake Miller
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.