ผสานประวัติจากหลาย ๆ eshells


9

ก่อนที่จะเปลี่ยนเป็น eshell ฉันมีการตั้งค่า zsh เพื่อที่จะ:

  • เขียนลงในไฟล์ประวัติหลังจากทุกคำสั่ง
  • ต่อท้ายแทนที่จะเขียนทับไฟล์ประวัติดังนั้นเมื่อใช้งานเชลล์หลาย ๆ เชลล์พวกเขาทั้งหมดจะถูกรวมเข้าเป็นหนึ่งในประวัติที่ยิ่งใหญ่

ตัวเลือก zsh ทั้งสองมีการจัดทำเอกสารไว้ที่นี่ (ดู APPEND_HISTORY และ INC_APPEND_HISTORY)

สิ่งนี้มีประโยชน์มากเมื่อรวมกับขนาดประวัติขนาดใหญ่เพราะคุณสามารถเปิดเปลือกใหม่หลังจากออกคำสั่งและค้นหาในประวัติของคุณ (หากไม่มีตัวเลือกเหล่านี้ประวัติขนาดใหญ่จะไม่มีประโยชน์เนื่องจากจะมีเพียงประวัติของการปิดล่าสุดเท่านั้น เปลือก). นอกจากนี้ยังหมายความว่าคุณสามารถเปิดเชลล์ใหม่และให้พวกเขารู้คำสั่งล่าสุดของคุณในเชลล์อื่นทันที มีวิธีการตั้งค่า eshell กับพฤติกรรมนี้หรือไม่? กระสุนแรกดูเหมือนจะง่ายพอ แต่การต่อท้ายดูเหมือนจะยากกว่า ...

คำตอบ:


3

ข้อจำกัดความรับผิดชอบ: ฉันไม่ได้ใช้ eshell ดังนั้นให้เอาเกลือเม็ดหนึ่งไปด้วย

eshellดูเหมือนจะเรียกeshell-write-historyกับประวัติศาสตร์การเขียนซึ่งจะมีข้อโต้แย้งที่เป็นตัวเลือกที่เริ่มต้นที่append nilดูเหมือนว่าข้อโต้แย้งนี้จะไม่ได้ใช้งานในeshellปัจจุบัน แต่ดูเหมือนว่าจะใช้งานได้ (มันผ่านการโต้แย้งไปยังwrite-regionซึ่งจะผนวกอย่างถูกต้อง)

มีตัวเลือกสองสามตัวที่นี่

  1. (setq eshell-save-history-on-exit nil)และเรียกeshell-write-historyตัวเองว่า
  2. กำหนดใหม่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))

ขอบคุณมันดูดีมาก ตัวอย่างข้อมูลแรกของคุณไม่มีเครื่องหมายคำพูดอยู่ท้ายเอกสาร
โจเซฟการ์วิน

ฉันต้องแก้ไขมันบ้างเปลี่ยนเป็นวงแหวนต้องแก้ไขโดยฟังก์ชั่น ring- * หรือคุณพบข้อผิดพลาด นอกจากนี้ฉันใช้การเชื่อมแบบไดนามิกเพื่อแทนที่นิยามของ eshell-history-ring ชั่วคราวแทนการทำสำเนา หากคุณใส่รหัสที่นี่ในคำตอบของคุณฉันจะทำเครื่องหมายว่ายอมรับเนื่องจากคุณได้ลูกบอลกลิ้ง: pastebin.com/zEE7B6d7
Joseph Garvin

@JosephGarvin เรียบร้อยแล้ว!
J David Smith

การแก้ปัญหานี้ใช้งานได้ดี แต่ฉันยังมีการตั้งค่าeshell-exit-hookศูนย์เพราะนี้โดยอัตโนมัติได้รับการโหลดเมื่อ eshell (add-hook 'eshell-exit-hook 'eshell-write-history nil t)เริ่มต้น: ฉันตั้งเบ็ดเป็นศูนย์ในท้องถิ่นเช่นนี้ (เป็นศูนย์ทั่วโลกตามค่าเริ่มต้น):(add-hook 'eshell-mode-hook '(lambda () (setq eshell-exit-hook nil)))
GDP2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.