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.


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.)


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.