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