Para ser claro, não estou falando de nada que exija que o emacs seja multithread (embora isso provavelmente também resolva isso). Reproduzir:
- emacs -Q # Estou executando 24.4.1
- Faça um segundo quadro
- Voltar ao primeiro quadro
- Mx shell
- Mx renomear-exclusivamente (vamos fazer um segundo shell mais tarde)
- Comece a correr:
while true; do echo "hello world"; done
- No segundo quadro, o shell Mx
O segundo shell quase nunca será exibido (raramente funciona após tentativas repetidas). Aparentemente, o emacs nunca fará uma pausa na leitura da saída do primeiro shell para ouvir a saída de qualquer outro processo. Seria um comportamento muito melhor para arredondar o robin quando houver vários processos com saída pendente. Existe alguma maneira de obter um melhor comportamento?
O único truque que eu sei seria tornar o shell um buffer para seu próprio processo, mas infelizmente isso não funcionará para mim. Mesmo se eu fizer isso, tenho que executar um subprocesso para ouvir um soquete para o meu software de reconhecimento de fala funcionar, para que eu possa realmente controlar o shell em primeiro lugar, foi assim que descobri; executar um loop infinito como o acima evita que quaisquer dados sejam retirados do soquete.
fonte
start-process
com aset-process-filter
e aset-process-sentinel
- isso permite que eu siga meu caminho alegre fazendo outras coisas enquanto o processo é executado - eu até envio minha saída às vezes para o*Messages*
buffer usandoinsert
para que minha área de eco fique intocada ou uso um buffer de saída do processo dedicado (se necessário). Por exemplo, eu posso executar umarsync
sessão longa . Eu não tenho nenhuma experiência tentando executar vários simultâneos / longosstart-process
, por isso não tenho certeza de como o Emacs lidaria com muitos deles.Respostas:
Portanto, essa não é uma solução adequada, mas eu executei seu teste ao contrário (por exemplo, enquanto isso [1] no segundo shell) e funciona bem. Como solução alternativa, você pode garantir que todos os buffers de shell que provavelmente geram uma saída pesada sejam criados depois dos que você deseja interatividade. Dessa forma, as conchas interativas são as primeiras a serem tratadas pela pesquisa inferior do Emacs antes de finalmente lidar com a que gera muita produção.
Na prática, se você estiver executando uma seleção de shell interativo, provavelmente não estará em uma situação em que monopolize a E / S por tanto tempo. Se você precisar regularmente disso, talvez redirecionar a saída para um arquivo e usar o modo de exibição seja uma solução melhor?
fonte