Ativando M-! em M- & (a'ka emacs equivale a bash Ctrl-Z)

14

De vez em quando, M-! some_commanddescobri 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_commande prometo me usar da M-&próxima vez. Mas M-!está na minha memória muscular há décadas ... E é claro que Ctrl-Gsim, 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, bge 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).

Mekk
fonte
2
Você pode estar interessado em saber que simplesmente adicionar um &no final de um regular shell-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.
Nanny
4
Você sempre pode remapear M-!para async-shell-command. :-) Parece que a única coisa que você perde é obter a saída na área de eco quando ela é curta o suficiente.
glucas
1
@ Nanny, de fato, é tudo o que async-shell-commandfaz. Ele adiciona um &ao final da COMMANDstring e é executado shell-command.
Matthew Piziak

Respostas:

2

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)?

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:

(global-set-key (kbd "M-!") #'async-shell-command)
(global-set-key (kbd "M-&") #'shell-command)
PythonNut
fonte
Rebinding M-! to async-shell-command faz sentido parcial, mas: (1) não tenho certeza sobre M-1 M-! comportamento (saída do comando para o buffer) - casos simples e rápidos funcionam, mas e se o comando for mais lento e eu digitar sth? (2) em muitos casos, eu gosto do congelamento até que o comando termine o comportamento, pois fornece uma indicação clara do acabamento (alguns comandos não têm saída ...); portanto, o pressionamento explícito da tecla "colocar em segundo plano" seria melhor (3) o async deixa os buffers assíncronos que devem ser colhido
Mekk
Eu estou pensando se seria possível escrever algum wrapper em torno do comando async-shell-shell (uma função que geraria o comando async-shell-shell, aguarde o término, reaja ao Ctrl-G interrompendo o comando e a alguma outra tecla pressionando está executando, mas não está mais aguardando, e colhe o buffer Async uma vez feito, se a saída estiver vazia ou curta). Não sei como fazer essa parte de espera ...
Mekk