Come migliorare le prestazioni del troncamento del buffer eshell?


8

Attualmente troncare i buffer a 20.000 righe aggiungendo quanto segue alla mia configurazione:

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

Funziona benissimo per <20.000 righe e una volta che il buffer raggiunge le 20.000 righe, viene troncato su ogni riga (quindi rimane a 20.001 righe per sempre). Tuttavia, quando il buffer raggiunge 20.000 righe, ogni riga successiva impiega molto più tempo per essere stampata e fa sì che la CPU di emacs rimanga al 100% per un bel po '.

C'è un modo per migliorare le prestazioni del troncamento del buffer? Forse troncando solo ogni 100 righe aggiunte? Non è che ho davvero bisogno che sia esattamente 20.000 righe, non voglio che il buffer cresca all'infinito.


3
Perché non troncare dopo il tempo di inattività?
PythonNut,

viene troncato su ogni riga perché viene eseguito eshell-truncate-bufferogni volta che viene prodotto un output. Potrebbe essere più sensato rendere il troncamento indipendente dalla produzione di output. Come @PythonNut suggerisce che il troncamento dopo il timeout sembra più ragionevole.
rekado,

Risposte:


6

Prendendo il suggerimento da PythonNut e rekado, sono passato al troncamento quando inattivo, quindi la mia soluzione attuale assomiglia a:

(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))

Dopo questo, non ho più bisogno di aggiungere 'eshell-truncate-buffera 'eshell-output-filter-functions. Funziona benissimo!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.