De vez em quando, M-! some_command
descobri que o comando é executado mais do que eu esperava e mantém meu emacs congelado por longos segundos. Então eu olho para o meu emacs congelado e me chuto por não usar M-& some_command
e prometo me usar da M-&
próxima vez. Mas M-!
está na minha memória muscular há décadas ... E é claro que Ctrl-G
sim, mas há casos em que não é preferível interromper o comando e reexecutá-lo (talvez possa quebrar o sth, talvez seja caro executá-lo novamente).
Erro semelhante no shell konsole é trivial de corrigir Ctrl-Z
, bg
e o trabalho está sendo executado em segundo plano.
Existe algum truque semelhante no emacs - uma maneira de transformar o comando em primeiro plano (síncrono) atualmente em execução em um segundo plano (assíncrono)?
Nota: caso seja impossível por padrão M-!
, estou aberto a sugestões de como voltar a criar M-!
outra coisa (o que seria funcionalmente equivalente além desse truque).
&
no final de um regularshell-command
(M-!
) o tornará assíncrono. Obviamente, você deve fazer isso antes de executar um comando, mas pelo menos pode usar a mesma combinação de teclas.M-!
paraasync-shell-command
. :-) Parece que a única coisa que você perde é obter a saída na área de eco quando ela é curta o suficiente.async-shell-command
faz. Ele adiciona um&
ao final daCOMMAND
string e é executadoshell-command
.Respostas:
Suspeito que não exista esse truque. O problema é que o comando shell síncrono (que é realmente
call-process-region
) bloqueia o loop de eventos do emacs. A única maneira de interromper é interromper o processo com um sinal USR1 ou USR2 ou fazer C-g. (Pode haver outras maneiras, mas é o que eu faço).Isso significa que não há nada que você possa fazer porque não tem como invocar o truque, pois o Emacs não processa a entrada enquanto o loop de eventos está parado.
Uma coisa que você pode fazer é simplesmente trocar as chaves:
fonte