Mengingat riwayat antar sesi dalam Mode Lisac Inferior Emacs

9

Saya tidak bisa membuat Emacs mengingat sejarah untuk *ielm*buffer di antara sesi. Sejauh yang saya tahu, sejarah tersebut dicatat dalam variabel buffer-local comint-input-ring. Karena itu saya telah menambahkan ekspresi berikut ke file init saya:

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

Itu tidak bekerja. Saya tahu bahwa desktoppaket itu berfungsi karena Emacs mengingat variabel global yang telah saya tambahkan ke desktop-globals-to-savedalam file init saya.

-

EDIT: savehisttidak berfungsi juga. Saya kira itu karena comint-input-ringvariabel penyangga-lokal.

Elena
sumber
1
Tidak ada waktu sekarang untuk memeriksa mengapa itu tidak berfungsi untuk desktop. Tetapi Anda dapat mencoba menggunakan savehist.eldan menambahkan variabel ini ke daftar vars untuk menyimpan.
Drew
Terima kasih, Drew, tetapi saya sudah memikirkannya savehist(maaf karena tidak menyebutkannya). Sejauh yang saya bisa lihat, itu hanya untuk variabel global, sedangkan comint-input-ringbuffer-lokal. Sekarang, saya sudah mencobanya, tanpa hasil.
Elena
PERINGATAN: Solusi berikut ini adalah penistaan ​​agama !!!! Berikan komentar di comint.eldalam dua baris kode berikut: (put 'comint-input-ring 'permanent-local t)dan (make-local-variable 'comint-input-ring). Lalu, tambahkan comint-input-ringke desktop-locals-to-save. Terakhir, kompilasi ulang byte file yang berlaku, mulai ulang Emacs dan nikmati kehidupan semaksimal mungkin.
lawlist

Jawaban:

5

Anda bisa menyimpan nilai buffer-local comint-input-ringdalam variabel global ketika *ielm*buffer terbunuh dan mengembalikannya di 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)

Sekarang Anda harus dapat menambahkan ielm-comint-input-ringuntuk savehist-additional-variablesmendapatkan perilaku yang Anda inginkan. (Saya menguji pendekatan ini; Anda seharusnya bisa menggunakannya desktop-locals-to-savejuga.)

Constantine
sumber
1
Anda harus menggunakan LOCALargumen untuk add-hook, bukan manual memanggil make-local-variabledi kill-buffer-hook. Yang terakhir dapat menyebabkan masalah ketika kemudian mencoba untuk menambahkan panggilan balik ke hook secara global.
phils
Saya sangat senang menemukan bahwa ini bekerja inf-mongodengan baik (atau, mungkin, mode lain yang menggunakan comint) Itu sangat membantu, dan juga mengajari saya sedikit lebih banyak ... terima kasih!
Blake Miller