Como melhorar o desempenho do truncamento de buffer eshell?

8

Atualmente, truncar buffers em 20.000 linhas adicionando o seguinte à minha configuração:

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

Isso funciona muito bem para <20.000 linhas e, quando o buffer atinge 20.000 linhas, ele é truncado em todas as linhas (portanto fica em 20.001 linhas para sempre). No entanto, quando o buffer atinge 20.000 linhas, cada linha subsequente leva muito mais tempo para ser impressa e faz com que a CPU do emacs fique 100% por um bom tempo.

Existe uma maneira de melhorar o desempenho do truncamento do buffer? Talvez apenas truncar a cada 100 linhas adicionadas? Não é como se eu realmente precisasse ter exatamente 20.000 linhas, só não quero que o buffer cresça infinitamente.

Lee H
fonte
3
Por que não truncar após o tempo ocioso?
precisa saber é o seguinte
fica truncado em todas as linhas porque você executa eshell-truncate-buffercada vez que a saída é produzida. Pode fazer mais sentido tornar o truncamento independente na produção de saída. Como o @PythonNut sugere, truncar após o tempo limite parece mais razoável.
rekado

Respostas:

6

Tomando a sugestão do PythonNut e do rekado, mudei para truncar quando ocioso, então minha solução atual se parece com:

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

Depois disso, eu já não necessidade de adicionar 'eshell-truncate-buffera 'eshell-output-filter-functions. Está funcionando muito bem!

Lee H
fonte