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.