Comment améliorer les performances de la troncature du tampon eshell?

8

Je tronque actuellement les tampons à 20 000 lignes en ajoutant ce qui suit à ma configuration:

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

Cela fonctionne très bien pour <20 000 lignes, et une fois que le tampon atteint 20 000 lignes, il est tronqué sur chaque ligne (il reste donc à 20 001 lignes pour toujours). Cependant, lorsque le tampon atteint 20 000 lignes, chaque ligne suivante prend beaucoup plus de temps à imprimer et fait que le processeur d'emacs reste à 100% pendant un certain temps.

Existe-t-il un moyen d'améliorer les performances de la troncature du tampon? Peut-être seulement tronquer toutes les 100 lignes ajoutées? Ce n'est pas comme si j'avais vraiment besoin que ce soit exactement 20 000 lignes, je ne veux tout simplement pas que le tampon augmente à l'infini.

Lee H
la source
3
Pourquoi ne pas tronquer après le temps d'inactivité?
PythonNut
il est tronqué sur chaque ligne car vous l'exécutez à eshell-truncate-bufferchaque fois que la sortie est produite. Il peut être plus judicieux de rendre la troncature indépendante de la production de sortie. Comme @PythonNut le suggère, la troncature après le délai d'attente semble plus raisonnable.
rekado

Réponses:

6

En prenant la suggestion de PythonNut et rekado, je suis passé à la troncature lorsqu'il est inactif, donc ma solution actuelle ressemble à:

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

Après cela, je ne plus besoin d'ajouter 'eshell-truncate-bufferà 'eshell-output-filter-functions. Cela fonctionne très bien!

Lee H
la source