Отказ от ответственности: я не использую 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))