LinuxでEmacsを使っていると,Emacsを起動するごとにプロセスが立ち上がり,別のウィンドウが生成される.これに対して,Macの場合,基本的に複数のプロセスが起動することはないし,ウィンドウも一つしか生成されないのが普通だ.
これを複数起動できるようにしてみたい.
TerminalからEmacsを複数起動する
公式にしたがって,
$ brew cask install emacs
でインストールしたEmacsは大抵の場合 /Applications/Emacs.app
にある.もし別の場所にインストールした場合は,以降のアプリケーションパスを読み替えてほしい.
$ 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を都度起動するようにしている.