Wie kann die Leistung des Abschneidens von Eshell-Puffern verbessert werden?


8

Ich schneide derzeit Puffer in 20.000 Zeilen ab, indem ich meiner Konfiguration Folgendes hinzufüge:

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

Dies funktioniert hervorragend für <20.000 Zeilen. Sobald der Puffer 20.000 Zeilen erreicht, wird er in jeder Zeile abgeschnitten (sodass er für immer bei 20.001 Zeilen liegt). Wenn der Puffer jedoch 20.000 Zeilen erreicht, dauert es viel länger, bis jede nachfolgende Zeile gedruckt wird, und die CPU von Emacs bleibt eine ganze Weile bei 100%.

Gibt es eine Möglichkeit, die Leistung der Pufferkürzung zu verbessern? Vielleicht nur alle 100 hinzugefügten Zeilen abschneiden? Es ist nicht so, dass ich wirklich genau 20.000 Zeilen brauche , ich möchte nur nicht, dass der Puffer unendlich wächst.


3
Warum nicht nach der Leerlaufzeit abschneiden?
PythonNut

Es wird in jeder Zeile abgeschnitten, da Sie eshell-truncate-bufferjedes Mal ausführen, wenn eine Ausgabe erstellt wird. Es kann sinnvoller sein, das Abschneiden unabhängig von der Ausgabe zu machen. Wie @PythonNut vorschlägt, erscheint das Abschneiden nach einer Zeitüberschreitung vernünftiger.
rekado

Antworten:


6

Ich habe den Vorschlag von PythonNut und rekado übernommen und im Leerlauf auf Abschneiden umgestellt. Meine aktuelle Lösung sieht also folgendermaßen aus:

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

Danach habe ich nicht mehr benötigen , hinzufügen 'eshell-truncate-bufferzu 'eshell-output-filter-functions. Es funktioniert super!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.