Fusionar el historial de múltiples eshells

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.

  1. (setq eshell-save-history-on-exit nil) y llame a eshell-write-history usted mismo
  2. 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))

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım