Ghi nhớ lịch sử giữa các phiên trong Chế độ Lisp kém hơn Emacs


9

Tôi không thể làm cho Emacs nhớ lịch sử cho *ielm*bộ đệm giữa các phiên. Theo như tôi có thể nói, lịch sử như vậy được ghi lại trong biến đệm cục bộ comint-input-ring. Vì vậy, tôi đã thêm biểu thức sau vào tệp init của mình:

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

Nó không hoạt động. Tôi biết rằng desktopgói đang hoạt động vì Emacs nhớ các biến toàn cục mà tôi đã thêm vào desktop-globals-to-savetrong tệp init của mình.

-

EDIT: savehistcũng không hoạt động. Tôi cho rằng đó là vì comint-input-ringmột biến đệm cục bộ.


1
Không có thời gian để kiểm tra tại sao nó có thể không hoạt động cho máy tính để bàn. Nhưng bạn có thể thử sử dụng savehist.elvà thêm biến này vào danh sách các vars để lưu.
vẽ

Cảm ơn, Drew, nhưng tôi đã nghĩ về savehistrồi (xin lỗi vì đã không đề cập đến nó). Theo như tôi có thể thấy, nó chỉ dành cho các biến toàn cục, trong khi đó comint-input-ringlà bộ đệm cục bộ. Bây giờ, tôi đã thử nó bằng mọi cách, nhưng không thành công.
Elena

CẢNH BÁO: Giải pháp sau đây là báng bổ !!!! Nhận xét bên trong comint.elhai dòng mã sau: (put 'comint-input-ring 'permanent-local t)(make-local-variable 'comint-input-ring). Sau đó, thêm comint-input-ringvào desktop-locals-to-save. Cuối cùng, biên dịch lại byte các tệp áp dụng, khởi động lại Emacs và tận hưởng cuộc sống trọn vẹn.
luật

Câu trả lời:


5

Bạn có thể lưu giá trị bộ đệm cục bộ của comint-input-ringmột biến toàn cục khi *ielm*bộ đệm bị giết và khôi phục nó trong 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)

Bây giờ bạn sẽ có thể thêm ielm-comint-input-ringvào savehist-additional-variablesđể có được hành vi bạn muốn. (Tôi đã thử nghiệm phương pháp này; bạn cũng có thể sử dụng desktop-locals-to-save.)


1
Bạn nên sử dụng các LOCALlập luận để add-hook, chứ không phải bằng tay gọi make-local-variablevề kill-buffer-hook. Cái sau có thể gây ra vấn đề khi sau đó cố gắng thêm các cuộc gọi lại vào hook trên toàn cầu.
phils

Tôi rất hài lòng khi thấy rằng nó inf-mongocũng hoạt động tốt (hoặc, có lẽ, bất kỳ chế độ nào khác sử dụng comint) Điều đó rất hữu ích, và cũng dạy tôi thêm một chút nữa ... cảm ơn!
Blake Miller
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.