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.
eshellxuất hiện để gọi eshell-write-historyđể viết lịch sử, trong đó có một đối số tùy chọn appendmặc định nil. Đối số này dường như không được sử dụng eshellhiệ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-historycho 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-historychứ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 Xtrong 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-historychứ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))