Disclaimer: non uso eshell, quindi prendilo con un po 'di sale.
eshellsembra chiamare eshell-write-historyper scrivere la cronologia, che accetta un argomento opzionale appendpredefinito nil. Questo argomento sembra essere eshellattualmente inutilizzato , ma sembra funzionare (passa l'argomento a write-region, che si aggiunge correttamente).
Ci sono un paio di opzioni qui.
(setq eshell-save-history-on-exit nil)e chiamare eshell-write-historyte stesso
- Ridefinisci
eshell-write-historyper soddisfare le tue esigenze.
Personalmente, andrei con 1.
Come esempio:
(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)
Grazie a @ joseph-garvin per la eshell-append-historyfunzione corretta e funzionante
Questo non gestisce il caricamento dinamico dei contenuti della nuova cronologia in una shell (ad es X. Esegui il comando nella shell A e visualizzalo nella cronologia nella shell B senza ricaricare; come SHARE_HISTORY di zsh). Non so quanto sia efficiente eshell-read-history, quindi sarei titubante nel farlo funzionare.
È anche possibile che tu finisca con voci duplicate con questa eshell-append-historyfunzione. Potrebbe essere necessario eseguire alcuni shenanigans cancellando tutto tranne la voce più recente eshell-history-ring, quindi ripristinandola al valore precedente dopo aver scritto la cronologia.
Per esempio
(let ((old-ring (copy-list eshell-history-ring)))
(setq eshell-history-ring (list (car eshell-history-ring)))
; write
(setq eshell-history-ring old-ring))