明確にするために、私はemacsをマルチスレッド化する必要のあることについては何も話していません(おそらくこれも解決されるでしょう)。再現するには:
- emacs -Q#24.4.1を実行しています
- 2番目のフレームを作成する
- 最初のフレームに戻る
- MXシェル
- Mx rename-uniquely(後で2番目のシェルを作成します)
- 実行を開始:
while true; do echo "hello world"; done
- 2番目のフレームでは、Mxシェル
2番目のシェルが表示されることはほとんどありません(まれに繰り返し試行しても機能します)。どうやらemacsは、最初のシェルの出力を読み取って他のプロセスからの出力をリッスンすることを決して中断しません。保留中の出力を持つ複数のプロセスがある場合、ラウンドロビンの方がはるかに良い動作になります。より良い行動をとる方法はありますか?
私が知っている唯一のトリックは、シェルバッファーを独自のプロセスにすることですが、残念ながらそれは私にはうまくいきません。それを行ったとしても、音声認識ソフトウェアが機能するようにソケットをリッスンするサブプロセスを実行する必要があります。そうすれば、シェルを最初に実際に制御できるようになります。これが、私がこれを発見した方法です。上記のような無限ループを実行すると、データがソケットから取り出されなくなります。
start-process
はaset-process-filter
とa を使用するのが好きset-process-sentinel
です-これにより、プロセスの実行中に他のことを実行して陽気な方法に進むことができます- エコー領域が触れられないように*Messages*
使用して出力をバッファーに送信することもできますinsert
、または使用します専用のプロセス出力バッファー(必要な場合)。たとえば、長いrsync
セッションを実行できます。私はstart-process
、複数の同時/時間のかかるを実行しようとした経験はありません。そのため、Emacsがそれらのすべての処理をどのように処理するかわかりません。