Pregunta:
Antes de cambiar a eshell, tenía la configuración de zsh para que:
- Escriba en el archivo de historial después de cada comando
- Agregue en lugar de sobrescribir el archivo de historial para que, al ejecutar varios shells, todos se fusionen en un gran historial
Ambas opciones de zsh están documentadas aquí (consulte APPEND_HISTORY e INC_APPEND_HISTORY).
Esto es muy útil cuando se combina con un tamaño de historial grande porque puede abrir un nuevo shell semanas después de emitir un comando y encontrarlo en su historial (sin estas opciones, un historial grande es inútil ya que solo contendrá el historial de los más recientemente cerrados cáscara). También significa que puede abrir nuevos shells y hacer que conozcan inmediatamente sus comandos más recientes en otros shells. ¿Hay alguna forma de configurar eshell con este comportamiento? La primera viñeta parece bastante fácil, pero agregar parece más complicado …
Respuesta:
Descargo de responsabilidad: no uso eshell, así que tómate esto con un grano de sal.
eshell
parece llamar a eshell-write-history
para escribir el historial, que toma un argumento opcional append
que por defecto es nil
. Este argumento parece no estar utilizado en eshell
actualmente, pero parece funcionar (pasa el argumento a través de write-region
, que se adjunta correctamente).
Aquí hay un par de opciones.
-
(setq eshell-save-history-on-exit nil)
y llame aeshell-write-history
usted mismo - Redefina el
eshell-write-history
para satisfacer sus necesidades.
Personalmente, iría con 1.
Como ejemplo:
(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)
Gracias a @ joseph-garvin por la función eshell-append-history
corregida eshell-append-history
funcionamiento
Esto no maneja la carga dinámica del nuevo contenido del historial en un shell (por ejemplo, ejecutar el comando X
en el shell A y hacer que aparezca en el historial en el shell B sin recargar; como SHARE_HISTORY de zsh). No sé qué tan eficiente es eshell-read-history
, así que dudaría en ejecutarlo en un gancho.
También es posible que termine con entradas duplicadas con esta función eshell-append-history
. Es posible que deba hacer algunas travesuras para borrar todas las entradas excepto la más reciente de eshell-history-ring
, y luego restablecerlo al valor anterior después de escribir el historial.
P.ej
(let ((old-ring (copy-list eshell-history-ring)))
(setq eshell-history-ring (list (car eshell-history-ring)))
; write
(setq eshell-history-ring old-ring))