Activando M-! en M- y (a'ka emacs equiv a bash Ctrl-Z)

14

De vez en cuando me doy M-! some_commandcuenta de que el comando se ejecuta más de lo esperado y mantiene mis emacs congelados durante largos segundos. Así que miro mis emacs congelados y me pateo por no usar M-& some_commandy me prometo usar la M-&próxima vez. Pero M-!está en mi memoria muscular durante décadas ... Y, por supuesto, lo hay Ctrl-G, pero hay casos en los que romper el comando y volver a ejecutarlo no es preferible (tal vez pueda romper algo, tal vez sea costoso volver a ejecutar ...).

Un error similar en shell konsole es trivial para corregir Ctrl-Z, bgy el trabajo se ejecuta en segundo plano.

¿Existe algún truco similar en emacs, una forma de convertir el comando actual en primer plano (síncrono) en uno en segundo plano (asíncrono)?

Nota: en caso de que sea imposible por defecto M-! , estoy abierto a sugerencias sobre cómo volver a vincular M-!a otra cosa (lo que sería funcionalmente equivalente aparte de este truco).

Mekk
fuente
2
Puede interesarle saber que simplemente agregando un &al final de un regular shell-command( M-!) lo hará asíncrono. Por supuesto, debe hacer esto antes de ejecutar un comando, pero al menos puede usar la misma combinación de teclas.
niñera
44
Siempre puedes reasignar M-!a async-shell-command. :-) Parece que lo único que pierde es obtener la salida en el área de eco cuando es lo suficientemente corta.
glucas
1
@nanny, de hecho, eso es todo async-shell-command. Agrega un &al final de la COMMANDcadena y se ejecuta shell-command.
Matthew Piziak

Respuestas:

2

¿Existe algún truco similar en emacs, una forma de convertir el comando actual en primer plano (síncrono) en uno en segundo plano (asíncrono)?

Sospecho que no existe tal truco. El problema es que el comando de shell sincrónico (que es realmentecall-process-region ) bloquea el bucle de eventos emacs. La única forma de romperlo es matar el proceso con una señal USR1 o USR2 o hacer C-g. (Puede haber otras formas, pero eso es lo que hago).

Esto significa que no hay nada que pueda hacer porque no tiene una forma de invocar el truco, ya que Emacs no procesa la entrada mientras el bucle de eventos está estancado.


Una cosa que puede hacer es simplemente cambiar las teclas:

(global-set-key (kbd "M-!") #'async-shell-command)
(global-set-key (kbd "M-&") #'shell-command)
PythonNut
fuente
Rebobinado M-! async-shell-command tiene un sentido parcial, pero: (1) ¡No estoy seguro acerca de M-1 M-! comportamiento (salida del comando al búfer): los casos rápidos simples funcionan, pero ¿qué sucede si el comando es más lento y escribo algo? (2) en muchos casos, me gusta la congelación hasta que el comando finaliza el comportamiento, ya que proporciona una indicación clara de finalización (algunos comandos no tienen salida ...), por lo tanto, la pulsación explícita de teclado "poner en segundo plano" sería mejor (3) async deja esos búferes Async que deben ser cosechado
Mekk
Estoy pensando si sería posible escribir algún contenedor alrededor de async-shell-command (una función que generaría async-shell-command, luego esperar a que termine, reaccionar a Ctrl-G al abortar el comando y a alguna otra pulsación de tecla al dejar se ejecuta pero ya no espera, y cosecha el búfer asíncrono una vez hecho si la salida está vacía o es corta). No estoy seguro de cómo hacer esa parte de espera ...
Mekk