En algunos casos, al delegar el trabajo a un proceso externo, es útil establecer un tiempo de espera en el comando para evitar que Emacs se cuelgue indefinidamente.
Desafortunadamente, lo siguiente no funciona.
(with-timeout (1 nil)
(call-process "/usr/bin/bash" nil t nil "-c" "sleep 10"))
Lo mismo vale para shell-command.
¿Hay alguna manera de establecer un tiempo de espera en estos procesos sincrónicos?
Es decir, quiero que el proceso se elimine automáticamente si no termina en un cierto número de segundos. ¿Es eso posible?
shell-command
process
Malabarba
fuente
fuente

with-timeout, pero he usadokill-processydelete-process.call-processanterior está configurando la salida para que se imprima en el búfer actual (obtengo el mismo efecto si paso un búfer de salida diferente). ¿Es eso lo que quieres decir?call-processfuentes, pero ahora empiezo a sospechar que no hay forma de matarlo cuando se agota el tiempo.Respuestas:
Mientras se
call-processestá ejecutando, emacs procesará eventos,with-timeoutno funcionará sin esto:Todavía puede usar
with-timeoutcon procesos (semi) sincrónicos.Realmente usará un proceso asincrónico pero esperará sincrónicamente mientras se está ejecutando, Emacs procesará los eventos cuando ejecute
sit-for, que puede ejecutar durante 0 segundos. Luego puede usar el argumento timeout-forms dewith-timeoutpara matar el proceso si todavía se está ejecutando cuando se activa el tiempo de espera.fuente
(sit-for 0.2)después delwhileciclo, pero eso se siente inestable. ¿Hay alguna manera de saber que la salida se ha impreso en el búfer?(sit-for 0)emacs pasa demasiado tiempo dejando que se ejecute el proceso y no escuchando suficientes eventos e insertando el texto en el búfer. Cuando cambio el mío a(sit-for .05)cosas, las cosas funcionan mejor y todo el texto entra en mi búfer. Incluso para un proceso corto .05 segundos no es una sobrecarga preocupante.(sit-for 0.2)para que pasaran mis pruebas locales, y aun así, una vez que presioné los cambios, las pruebas de travis fallaron.Puede lograr esto simplemente agregando una invocación de tiempo de espera de GNU a su comando de shell, lo que evita la necesidad de conocer cualquier detalle sobre el comportamiento de Emacs. Por ejemplo ejecutando:
Regresará en 5 segundos, no en 10 (el tiempo de espera efectivamente presiona Ctrl-C para usted).
fuente