Avis de non-responsabilité: je n'utilise pas de coquille, alors prenez-le avec un grain de sel.
eshell
semble appeler eshell-write-history
pour écrire l'historique, qui prend un argument facultatif append
qui est par défaut nil
. Cet argument semble être inutilisé eshell
actuellement, 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-history
vous
- Redéfinissez
eshell-write-history
pour 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-history
fonction 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 X
dans 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-history
fonction. 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))
eshell-exit-hook
à zéro parce que cela est automatiquement chargé lorsque eshell commence:(add-hook 'eshell-exit-hook 'eshell-write-history nil t)
. Je mets le crochet localement à zéro comme ça (il est globalement nul par défaut):(add-hook 'eshell-mode-hook '(lambda () (setq eshell-exit-hook nil)))