¿Cómo mejorar el rendimiento del truncamiento del búfer de eshell?


8

Actualmente trunco ​​las memorias intermedias en 20,000 líneas agregando lo siguiente a mi configuración:

(setq eshell-buffer-maximum-lines 20000)
;; automatically truncate buffer after output
(add-to-list 'eshell-output-filter-functions 'eshell-truncate-buffer)

Esto funciona muy bien para <20,000 líneas, y una vez que el búfer llega a 20,000 líneas, se trunca en cada línea (por lo que se ubica en 20,001 líneas para siempre). Sin embargo, cuando el búfer alcanza las 20,000 líneas, cada línea subsiguiente tarda mucho más en imprimirse y hace que la CPU de emacs permanezca al 100% durante bastante tiempo.

¿Hay alguna manera de mejorar el rendimiento del truncamiento del búfer? ¿Quizás solo truncando cada 100 líneas agregadas? No es que realmente necesite que sea exactamente 20,000 líneas, simplemente no quiero que el búfer crezca infinitamente.


3
¿Por qué no truncar después del tiempo de inactividad?
PythonNut

se trunca en cada línea porque se ejecuta eshell-truncate-buffercada vez que se produce la salida. Puede tener más sentido hacer que el truncamiento sea independiente de la producción de salida. Como @PythonNut sugiere truncar después del tiempo de espera, parece más razonable.
rekado

Respuestas:


6

Tomando la sugerencia de PythonNut y rekado, he cambiado a truncar cuando está inactivo, por lo que mi solución actual se ve así:

(defun my/truncate-eshell-buffers ()
  "Truncates all eshell buffers"
  (interactive)
  (save-current-buffer
    (dolist (buffer (buffer-list t))
      (set-buffer buffer)
      (when (eq major-mode 'eshell-mode)
        (eshell-truncate-buffer)))))

;; After being idle for 5 seconds, truncate all the eshell-buffers if
;; needed. If this needs to be canceled, you can run `(cancel-timer
;; my/eshell-truncate-timer)'
(setq my/eshell-truncate-timer
      (run-with-idle-timer 5 t #'my/truncate-eshell-buffers))

Después de esto, ya no necesito añadir 'eshell-truncate-buffera 'eshell-output-filter-functions. ¡Funciona muy bien!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.