shell emacs elisp

¿Cómo puedo acelerar la salida de emacs desde un comando de shell asíncrono?



elisp (2)

Estoy ejecutando la salida de una aplicación en un búfer de emacs usando shell-command.

(shell-command "verbose-app &" "*verbose-app*")

El problema es que este comando es extremadamente detallado. Tanto es así, que a veces toma varios segundos para que el búfer de emacs se ponga al día. Se retrasa varios segundos con la salida real.

¿Hay alguna manera de acelerar el desplazamiento de salida deshabilitando algo? ¿Te gusta el uso de expresiones regulares o el resaltado de sintaxis?

Para futura referencia:

La aplicación verbosa es adb logcat. Cambié mi función existente:

(defun adb-logcat () (interactive) (shell-command "adb logcat -v threadtime&" "*adb-logcat*") (pop-to-buffer "*adb-logcat*") (buffer-disable-undo))

A lo siguiente:

(defun adb-logcat () (interactive) (start-process "*adb-logcat*" "*adb-logcat*" "/bin/sh" "-c" "adb logcat -v threadtime") (pop-to-buffer "*adb-logcat*") (buffer-disable-undo))

Se desplaza mucho más rápido ahora. ¡Hurra!


Como dice la documentación, shell-command ejecuta el comando en una shell inferior, lo que implica shell-mode . Si solo desea la salida y ninguna de las funciones, ejecutar el comando con start-process puede estar más cerca de lo que desea.

(start-process "*verbose-app*" "*verbose-app*" "/bin/sh" "-c" "verbose-app")

Envolver esto en una función no debería ser demasiado difícil. Es posible que desee ver cómo shell-command implementa los comandos asíncronos; por ejemplo, le preguntará si debe terminar un proceso existente si intenta crear uno cuando ya existe otro. http://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/simple.el#n2447 puede ser un buen punto de partida. (En caso de que el enlace se estropee, este es un enlace al defun shell-command dentro, que apunta a un comentario sobre el manejo del signo. Si está ahí, el comando se ejecutará de forma asíncrona).


Si el comando es tan detallado, ¿hay algún uso para capturar la salida completa en tiempo real? Tal vez podría ejecutar verbose-app > app.log en segundo plano y luego ejecutar algo así como while true; do tail -n50 app.log; sleep 1; done while true; do tail -n50 app.log; sleep 1; done while true; do tail -n50 app.log; sleep 1; done dentro de emacs para seguir actualizando el búfer para ver las últimas líneas del archivo de registro. Más adelante, cuando desee la salida completa, puede abrir el archivo de registro en emacs.