Vacíe toda la salida en el búfer de shell (y * Messages * también)

8

¿Hay alguna manera fácil de vaciar toda la salida en el shellbúfer? Desde hace poco (creo que Emacs 24.4 ya tiene esto) los *shell*buffers no son editables, se comportan de manera similar a cómo se comportaría un terminal típico, es decir, solo le permite agregar texto al final o vaciar la última salida, pero no puede agregue texto en cualquier lugar o elimine parte de él arbitrariamente. Parece que me falta algo importante sobre esta mejora (?). Realmente lo hace más molesto. Busqué en los documentos los buffers *shell*y *Messages*, pero no pude encontrar una mención de la pregunta.

Además de la pregunta original: ¿cuál es el punto de este cambio? Para mí, esto no parece una mejora en absoluto, por lo tanto, a menos que haya "una trampa", me gustaría configurarlo como lectura-escritura como predeterminado.

Estoy hablando de Emacs 24.4 , 25.0.50.1, por supuesto.

wvxvw
fuente
2
Parece molesto por alguna "mejora", pero no ha mencionado lo que es. De su etiqueta infiero que se refiere a Messagesser de solo lectura ahora, pero no veo cómo eso se relaciona con los buffers de shell.
Malabarba
1
El shellbúfer @Malabarba también solía ser completamente editable. Es decir, puede eliminar o agregar texto en cualquier momento que desee, mientras que ahora solo puede agregar texto al final, y no puede eliminarlo en ningún otro lugar también. *Messages*se comporta de la misma manera.
wvxvw

Respuestas:

5

(erase-buffer) no funcionará en las memorias intermedias de impresión y shell si son de solo lectura.

Aquí está el defun que uso con bastante frecuencia para eliminar los búferes cascarones:

(defun clear-comint-buffer ()
  (interactive)
  (let ((old-max comint-buffer-maximum-size))
    (setq comint-buffer-maximum-size 0)
    (comint-truncate-buffer)
    (setq comint-buffer-maximum-size old-max)
    (goto-char (point-max))))

Quizás pueda vincular esto s-ken sus modos relevantes para imitar el comportamiento de borrado de Terminal.app de OSX.

Actualización 11/2016

En algún lugar del desarrollo de Emacs 25 (y también en mi última compilación que es "26.0.50.1"), (comint-clear-buffer)se agregó a comint-mode, que es una versión más concisa de mi defun personalizado. Aquí está la fuente de referencia:

(defun comint-clear-buffer ()
  "Clear the comint buffer."
  (interactive)
  (let ((comint-buffer-maximum-size 0))
    (comint-truncate-buffer)))

Esta solución integrada también funciona si tiene (setq comint-prompt-read-only t).

waymondo
fuente
Bah, entonces esto es por diseño ... bueno, entonces esto responde la pregunta. Parece que tendré que buscar alternativas para M-x shellentonces: S
wvxvw
@wvxvw M-x erase-bufferfunciona perfectamente en un búfer de modo Shell en el tronco de Emacs, y no veo ninguna razón por la que no debería funcionar también en 24.4.
@wvxvw Estoy confundido. Mi búfer de shell no es de solo lectura, y borrar búfer funciona bien en él. Tal vez se ha cambiado de nuevo en Emacs-25, intentaré verificarlo más tarde.
Malabarba
@Malabarba Lo intenté, y funciona perfectamente.
2
@Malabarba / @lunaryorn: encontré la razón por la cual (erase-buffer)no me funciona personalmente. Tengo (setq comint-prompt-read-only t)en mi configuración, que me parece útil para no golpear el mensaje y, por lo tanto, (erase-buffer)me ladra.
waymondo
13

Puede limpiar el *Messages*búfer de la misma manera que siempre, con el kill-buffercomando. La próxima vez que se señale un mensaje, el búfer se volverá a crear.

La razón por la que este búfer es de solo lectura ahora, es porque se le ha otorgado su propio modo mayor , que hereda de special-mode, que es de solo lectura. Las ventajas detrás de eso son varias. special-modeestá diseñado para leer, por lo que tiene varias combinaciones de teclas que son muy convenientes para los buffers que no están destinados a ser editados.


No estoy seguro de qué *shell*tiene que ver con nada. Pero si quieres borrarlo, M-x erase-buffer deberías hacerlo.

Malabarba
fuente