Ricordare la storia tra le sessioni in modalità Lisp Inferior Emacs


9

Non riesco a far ricordare a Emacs la cronologia dei *ielm*buffer tra le sessioni. Per quanto ne so, tale cronologia viene registrata nella variabile buffer-local comint-input-ring. Pertanto ho aggiunto la seguente espressione al mio file init:

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

Non funziona So che il desktoppacchetto funziona perché Emacs ricorda le variabili globali a cui ho aggiunto il desktop-globals-to-savemio file init.

-

EDIT: savehistnon funziona neanche. Suppongo che sia perché comint-input-ringè una variabile buffer-locale.


1
Non c'è tempo ora per verificare perché potrebbe non funzionare per desktop. Ma puoi provare a utilizzare savehist.ele aggiungere questa variabile all'elenco di variabili da salvare.
— Estratto l'

Grazie, Drew, ma ci avevo savehistgià pensato (scusami per non averlo menzionato). Per quanto ho potuto vedere, era solo per variabili globali, mentre comint-input-ringè buffer-local. Ora l'ho provato comunque, senza successo.
— Elena,

ATTENZIONE: la seguente soluzione è blasfemia !!!! Commenta comint.elle seguenti due righe di codice: (put 'comint-input-ring 'permanent-local t)e (make-local-variable 'comint-input-ring). Quindi, aggiungi comint-input-ringa desktop-locals-to-save. Infine, ri-byte-compila i file applicabili, riavvia Emacs e goditi la vita al massimo.
— elenco delle leggi

Risposte:


5

È possibile salvare il valore buffer-local di comint-input-ringin una variabile globale quando un *ielm*buffer viene ucciso e ripristinarlo 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)

Ora si dovrebbe essere in grado di aggiungere ielm-comint-input-ringper savehist-additional-variablesottenere il comportamento desiderato. (Ho testato questo approccio; dovresti essere in grado di usare desktop-locals-to-saveanche tu , però.)


1
Si dovrebbe usare la LOCALdiscussione per add-hook, invece di chiamare manualmente make-local-variablesu kill-buffer-hook. Quest'ultimo potrebbe causare problemi quando successivamente si tenta di aggiungere callback all'hook a livello globale.
— phils

Mi ha fatto molto piacere scoprire che anche questo ha funzionato inf-mongo(o, presumibilmente, qualsiasi altra modalità che utilizza comint). È molto utile e mi ha anche insegnato un po 'di più ... grazie!
— Blake Miller,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.