ข้อจำกัดความรับผิดชอบ: ฉันไม่ได้ใช้ eshell ดังนั้นให้เอาเกลือเม็ดหนึ่งไปด้วย
eshell
ดูเหมือนจะเรียกeshell-write-history
กับประวัติศาสตร์การเขียนซึ่งจะมีข้อโต้แย้งที่เป็นตัวเลือกที่เริ่มต้นที่append
nil
ดูเหมือนว่าข้อโต้แย้งนี้จะไม่ได้ใช้งานในeshell
ปัจจุบัน แต่ดูเหมือนว่าจะใช้งานได้ (มันผ่านการโต้แย้งไปยังwrite-region
ซึ่งจะผนวกอย่างถูกต้อง)
มีตัวเลือกสองสามตัวที่นี่
(setq eshell-save-history-on-exit nil)
และเรียกeshell-write-history
ตัวเองว่า
- กำหนดใหม่
eshell-write-history
เพื่อตอบสนองความต้องการของคุณ
โดยส่วนตัวฉันจะไปกับ 1
ตัวอย่างเช่น:
(setq eshell-save-history-on-exit nil)
(defun eshell-append-history ()
"Call `eshell-write-history' with the `append' parameter set to `t'."
(when eshell-history-ring
(let ((newest-cmd-ring (make-ring 1)))
(ring-insert newest-cmd-ring (car (ring-elements eshell-history-ring)))
(let ((eshell-history-ring newest-cmd-ring))
(eshell-write-history eshell-history-file-name t)))))
(add-hook eshell-pre-command-hook #'eshell-append-history)
ขอบคุณ @ joseph-garvin สำหรับeshell-append-history
ฟังก์ชั่นการทำงานที่ถูกต้อง
สิ่งนี้ไม่จัดการการโหลดเนื้อหาประวัติใหม่แบบไดนามิกลงในเชลล์ (เช่นคำสั่งเรียกใช้X
ในเชลล์ A และให้ปรากฏในประวัติในเชลล์ B โดยไม่ต้องโหลดซ้ำเช่น SHARE_HISTORY ของ zsh) ฉันไม่รู้ว่ามีประสิทธิภาพแค่ไหนeshell-read-history
ดังนั้นฉันลังเลที่จะใช้มันในตะขอ
นอกจากนี้ยังเป็นไปได้ว่าคุณจะจบลงด้วยรายการที่ซ้ำกันด้วยeshell-append-history
ฟังก์ชั่นนี้ คุณอาจจะต้องทำการแก้ไขบางส่วนด้วยการล้างทั้งหมดยกเว้นรายการล่าสุดจากeshell-history-ring
นั้นจึงรีเซ็ตเป็นค่าเดิมหลังจากเขียนประวัติ
เช่น
(let ((old-ring (copy-list eshell-history-ring)))
(setq eshell-history-ring (list (car eshell-history-ring)))
; write
(setq eshell-history-ring old-ring))