Emacsで多数の非同期シェルコマンドを実行する

EmacsではM-!でシェルコマンドを実行できるんですが、これで実行したコマンドは同期実行になってしまって、コマンドが終了するまで他の操作ができなくなります。 時間のかかるコマンドや常にバックグラウンドで走らせておきたいコマンドを実行するには不便です(というか無理)。

実はM-!でシェルでやるようにコマンドの後ろに&をつけてやると、コマンドが非同期実行になり、Emacsのスレッドを停止しなくなるので他のバッファ操作をしながらコマンドを走らせておくことができます。便利ですね。あと、これM-&でもできます。

ただ、これ、デフォルトの状態だとひとつの非同期コマンドしか実行できないんですよ・・・。Railsでよくあるように、M-& rails serverして、M-& guard とかできないんです・・・。 なんとかならないもんかなあ、とググってたら発見しました。

Running a Shell Command Asynchronously

ここにあるコードで、複数コマンドのサポートが可能になります!あと、わかりやすいように元のコマンドを出力バッファのうえの方に表示してくれます!

わんだほー

※ 更新 2013-09-04: リンク先URLを修正しました。・・・が、どうやらemacswikiのリニューアルに伴ってアンカー指定でidまでスクロールできないようです。目次から"Running a Shell Command Asynchronously"をたどってください。