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.

Elena
la source
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.)

Constantine
la source
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