2012-08-23 12 views
18

Estoy ejecutando el resultado de una aplicación en un búfer de emacs usando shell-command.¿Cómo puedo acelerar la salida de emacs desde un shell-command asíncrono?

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

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

¿Hay alguna manera de acelerar el desplazamiento de salida desactivando algo? Al igual que la comparación de expresiones regulares o el resaltado de sintaxis?

Para futuras consultas:

La aplicación es prolijo Logcat ADB. He cambiado de función existente:

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

Para el 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 ahora de forma más rápida. ¡Hurra!

+0

Puede intentar anular el búfer de la salida de la aplicación detallada: http : //stackoverflow.com/a/3466024/265069 – Tom

+0

Estoy ejecutando MacOSX, por lo que unbuffer no está disponible. – hyperlogic

+0

No sé Os X, pero google dice esto: http://jubianchi.fr/help/3.Tweaks/unbuffered-processes Si no funciona, entonces es posible que desee buscar alternativas con google – Tom

Respuesta

10

Como dice la documentación, shell-command ejecuta el comando en una capa 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 comandos asincrónicos; por ejemplo, le preguntará si debe finalizar un proceso existente si intenta crear uno cuando ya existe otro. http://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/simple.el#n2447 podría ser un buen punto de partida. (En caso de que el enlace se ponga mal, este es un enlace al interior de defun shell-command, señalando un comentario sobre el manejo del símbolo comercial. Si está allí, el comando se ejecutará de forma asíncrona)

+0

Hmmm. ¿Cómo arreglo el enlace de Git para que apunte al HEAD actual a partir de hoy? – tripleee

+0

¡Señor, gane! Es al menos 4 veces más rápido ahora. – hyperlogic

0

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 como while true; do tail -n50 app.log; sleep 1; done dentro de emacs para seguir actualizando el búfer y ver las últimas líneas del archivo de registro. Más tarde, cuando desee obtener el resultado completo, puede abrir el archivo de registro en emacs.

Cuestiones relacionadas