การจดจำประวัติระหว่างเซสชันใน Inferior Emacs Lisp Mode


9

ฉันไม่สามารถทำให้ Emacs จดจำประวัติของ*ielm*บัฟเฟอร์ระหว่างเซสชันได้ comint-input-ringเท่าที่ผมสามารถบอกประวัติดังกล่าวจะถูกบันทึกไว้ในตัวแปรบัฟเฟอร์ท้องถิ่น ดังนั้นฉันจึงได้เพิ่มการแสดงออกต่อไปนี้ไปยังไฟล์ init ของฉัน:

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

มันไม่ทำงาน ฉันรู้ว่าdesktopแพคเกจใช้งานได้เพราะ Emacs จดจำตัวแปรทั่วโลกที่ฉันเพิ่มไว้desktop-globals-to-saveในไฟล์ init ของฉัน

-

แก้ไข: savehistไม่ทำงานอย่างใดอย่างหนึ่ง ฉันคิดว่าเป็นเพราะcomint-input-ringเป็นตัวแปรบัฟเฟอร์ท้องถิ่น


1
ยังไม่มีเวลาตรวจสอบสาเหตุที่อาจใช้งานเดสก์ท็อปไม่ได้ แต่คุณสามารถลองใช้savehist.elและเพิ่มตัวแปรนี้ในรายการ vars เพื่อบันทึก
ดึง

ขอบคุณ Drew แต่ฉันเคยคิดมาsavehistแล้ว (ขออภัยที่ไม่ได้กล่าวถึง) เท่าที่ฉันจะเห็นมันเป็นตัวแปรระดับโลกเท่านั้นในขณะที่comint-input-ringบัฟเฟอร์ในท้องถิ่น ตอนนี้ฉันได้ลองแล้วไม่ประสบความสำเร็จ
Elena

คำเตือน: วิธีการแก้ปัญหาต่อไปนี้เป็นการดูหมิ่น !!!! แสดงความคิดเห็นออกภายในcomint.elต่อไปสองบรรทัดรหัส: และ(put 'comint-input-ring 'permanent-local t) (make-local-variable 'comint-input-ring)จากนั้นให้เพิ่มการcomint-input-ring desktop-locals-to-saveสุดท้ายทำการคอมไพล์ไฟล์ที่เกี่ยวข้องรีสตาร์ท Emacs และสนุกกับการใช้ชีวิตให้เต็มที่
ลิสต์กฎหมาย

คำตอบ:


5

คุณสามารถบันทึกค่า buffer-local ของcomint-input-ringในตัวแปรโกลบอลเมื่อ*ielm*บัฟเฟอร์ถูกทำลายและกู้คืนใน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)

ตอนนี้คุณควรจะสามารถเพิ่มielm-comint-input-ringเพื่อsavehist-additional-variablesที่จะได้รับพฤติกรรมที่คุณต้องการ (ฉันทดสอบวิธีนี้คุณควรจะสามารถใช้ได้desktop-locals-to-saveเช่นกัน)


1
คุณควรใช้LOCALอาร์กิวเมนต์add-hookมากกว่าตนเองเรียกบนmake-local-variable kill-buffer-hookหลังอาจทำให้เกิดปัญหาเมื่อพยายามเพิ่มการเรียกกลับไปยังตะขอทั่วโลกในภายหลัง
phils

ฉันยินดีเป็นอย่างยิ่งที่พบว่าสิ่งนี้ทำงานได้inf-mongoดีเช่นกัน (หรือสันนิษฐานว่าโหมดอื่น ๆ ที่ใช้comint) นั้นมีประโยชน์มากและสอนฉันให้รู้จักเอลลิสอีกเล็กน้อย ... ขอบคุณ!
Blake Miller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.