Avis de non-responsabilité: je n'utilise pas de coquille, alors prenez-le avec un grain de sel.
eshellsemble appeler eshell-write-historypour écrire l'historique, qui prend un argument facultatif appendqui est par défaut nil. Cet argument semble être inutilisé eshellactuellement, mais semble fonctionner (il transmet l'argument à write-region, qui s'ajoute correctement).
Il y a quelques options ici.
- (setq eshell-save-history-on-exit nil)et appelez-- eshell-write-historyvous
- Redéfinissez eshell-write-historypour satisfaire votre exigence.
Personnellement, j'irais avec 1.
Par exemple:
(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)
Merci à @ joseph-garvin pour la eshell-append-historyfonction de travail corrigée
Cela ne gère pas le chargement dynamique du nouveau contenu de l'historique dans un shell (par exemple, exécuter la commande Xdans le shell A et le faire apparaître dans l'historique dans le shell B sans rechargement; comme SHARE_HISTORY de zsh). Je ne sais pas à quel point c'est efficace eshell-read-history, donc j'hésiterais à le lancer dans un crochet.
Il est également possible que vous vous retrouviez avec des entrées en double avec cette eshell-append-historyfonction. Vous devrez peut-être effectuer quelques manigances en effaçant toutes les entrées sauf la plus récente eshell-history-ring, puis en les réinitialisant à l'ancienne valeur après avoir écrit l'historique.
Par exemple
(let ((old-ring (copy-list eshell-history-ring)))
  (setq eshell-history-ring (list (car eshell-history-ring)))
  ; write
  (setq eshell-history-ring old-ring))