Bagaimana cara meningkatkan kinerja pemotongan buffer eshell?

8

Saat ini saya memotong buffer di 20.000 baris dengan menambahkan berikut ini ke konfigurasi saya:

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

Ini bekerja dengan baik untuk <20.000 baris, dan begitu buffer mencapai 20.000 baris, akan terpotong pada setiap baris (jadi ia duduk di 20.001 baris selamanya). Namun, ketika buffer mencapai 20.000 baris, setiap baris berikutnya membutuhkan waktu lebih lama untuk dicetak dan menyebabkan CPU emacs berada pada 100% untuk beberapa saat.

Apakah ada cara untuk meningkatkan kinerja pemotongan buffer? Mungkin hanya memotong setiap 100 baris yang ditambahkan? Ini tidak seperti aku benar-benar membutuhkannya untuk menjadi persis 20.000 baris, saya hanya tidak ingin buffer tumbuh jauh.

Lee H
sumber
3
Mengapa tidak memotong setelah waktu idle?
PythonNut
itu akan terpotong pada setiap baris karena Anda menjalankan eshell-truncate-buffersetiap output setiap kali diproduksi. Mungkin lebih masuk akal untuk membuat pemotongan independen pada menghasilkan output. Seperti @PythonNut menyarankan pemotongan setelah batas waktu tampaknya lebih masuk akal.
rekado

Jawaban:

6

Mengambil saran dari PythonNut dan rekado, saya telah beralih ke memotong saat idle, jadi solusi saya saat ini terlihat seperti:

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

Setelah ini, saya tidak lagi perlu menambahkan 'eshell-truncate-bufferke 'eshell-output-filter-functions. Ini bekerja dengan baik!

Lee H
sumber