Tuyên bố miễn trừ trách nhiệm: Tôi không sử dụng eshell, vì vậy hãy dùng nó với một hạt muối.
eshell
xuất hiện để gọi eshell-write-history
để viết lịch sử, trong đó có một đối số tùy chọn append
mặc định nil
. Đối số này dường như không được sử dụng eshell
hiện tại, nhưng có vẻ như hoạt động (nó chuyển đối số thông qua write-region
, mà không nối đúng).
Có một vài lựa chọn ở đây.
(setq eshell-save-history-on-exit nil)
và gọi eshell-write-history
cho mình
- Xác định lại
eshell-write-history
để đáp ứng yêu cầu của bạn.
Cá nhân, tôi sẽ đi với 1.
Ví dụ:
(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)
Cảm ơn @ joseph-garvin về eshell-append-history
chức năng làm việc đã được sửa
Điều này không xử lý tự động tải nội dung lịch sử mới vào shell (ví dụ: chạy lệnh X
trong shell A và để nó xuất hiện trong lịch sử trong shell B mà không cần tải lại; như SHARE_HISTORY của zsh). Tôi không biết hiệu quả của nó như thế nào eshell-read-history
, vì vậy tôi sẽ do dự khi chạy nó trong một cái móc.
Cũng có thể bạn sẽ kết thúc với các mục trùng lặp với eshell-append-history
chức năng này . Bạn có thể cần phải thực hiện một số shenanigans với việc xóa tất cả trừ mục nhập gần đây nhất từ eshell-history-ring
đó, sau đó đặt lại nó về giá trị cũ sau khi viết lịch sử.
Ví dụ
(let ((old-ring (copy-list eshell-history-ring)))
(setq eshell-history-ring (list (car eshell-history-ring)))
; write
(setq eshell-history-ring old-ring))