Відмова: Я не використовую ешель, тому прийміть це із зерном солі.
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 без перезавантаження; як zsh's SHARE_HISTORY). Я не знаю, наскільки це ефективно 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))