MacのEmacsを複数起動する

LinuxEmacsを使っていると,Emacsを起動するごとにプロセスが立ち上がり,別のウィンドウが生成される.これに対して,Macの場合,基本的に複数のプロセスが起動することはないし,ウィンドウも一つしか生成されないのが普通だ.

これを複数起動できるようにしてみたい.

TerminalからEmacsを複数起動する

www.gnu.org

公式にしたがって,

$ brew cask install emacs

でインストールしたEmacsは大抵の場合 /Applications/Emacs.app にある.もし別の場所にインストールした場合は,以降のアプリケーションパスを読み替えてほしい.

シェルスクリプトから毎回新しいEmacsを起動するには,

$ open -n -a /Applications/Emacs.app

とするだけで良い.

ファイルを開きたいのであれば,

$ open -n -a /Applications/Emacs.app ./filename

とすれば良い.

なので,以下のようなシェルスクリプトを作って,

#!/bin/bash

if [ $# -eq 1 ]; then
  open -n -a /Applications/Emacs.app $1
else
  open -n -a /Applications/Emacs.app
fi

これを /usr/local/bin/e とかで保存しておけば,e コマンドで毎回Emacsを新しく起動することができるようになる.

$ e

とすればEmacsが起動してくるし,

$ e ./filename

とすれば,Emacsが新しく起動してfilenameを開いてくれる.

ランチャー等から呼び出したEmacsを複数起動させる

これにはAppleScriptが必要になる.

Automatorを起動し,書類の種類として「アプリケーション」を選ぶ.「AppleScriptを実行」をドラッグして新しいワークフローを作成する.

このAppleScript

do shell script "open -n -a /Applications/Emacs.app"

として,例えばCocoaEmacsみたいな名前で/Applications に保存してやる.

すると,こいつはアプリケーションとして振る舞うので,CocoaEmacsを起動するたびにEmacsが新しく起動されるようになる.

FinderからクリックしたときにEmacsを起動させる

前述のCocoaEmacsは,ランチャーから起動した場合はEmacsを起動することができるが,ファイルをクリックして開く際には,そのファイルをEmacsで開くことができない. これをできるようにするために,再びCocoaEmacsのAppleScriptを開く.

on run {input, parameters}
  if (count of input) > 0 then
    set the_path to POSIX path of input
    set cmd to "open -n -a /Applications/Emacs.app" & quoted form of the_path $ "; exit"
    do shell script cmd
  else
    do shell script "open -n -a /Applications/Emacs.app"
  end if
end run

と書き換えよう. これにより,引数を受け取った場合は,その引数をPOSIXパスに変換して, /Applications/Emacs.app の引数として渡している.これにより,引数で渡されたファイルをEmacsで開くことができる.

あとは,Finderでファイルの関連付けを変更し,希望のファイルをCocoaEmacsで開くようにしてやれば,ファイルを開くたびに新しいEmacsが起動するようになる.

まとめ

ここまでEmacsを複数起動する話をしてきたけど,そもそもEmacsの起動時間を考えれば,本当はemacs serverを起動してemacsclientを毎回立ち上げる方が効率が良い.ので,今回の方法はあんまり使わないんじゃないだろうか. 調べてみたけど需要がそんなになさそうなのはそういことなんじゃないだろうか.

というわけで最近はむしろこの方法は使っていななくて,emacs serverを起動しっぱなしにしてemacsclientを都度起動するようにしている.