Emacsを22系(Carbon)から23系(Cocoa)へ乗り換え.

長い間,dmg 形式で配布されているCarbonEmacsを使っていたのだけれど,いつの頃からか置換などすると妙に遅いと感じるようになった.気のせいなのか,私がなんらかしでかしたのかは不明.
テキストエディタで反応が遅いのはストレス溜まる.AppleはアプリのCocoa化を推奨しているようだし,本家Emacsも23系からCocoaに移ったということで,乗り換えた.

ビルド

inline_patch-23.2-beta3.tar.gz と emacs-23.2a.tar.gz を引っ張ってきて展開してパッチ当てて configure して make bootstrap して make install.
Snow Leopard だと,Fink とか MacPorts とか使わんでも,Apple純正の状態でもビルドできるっぽい.Lion のことは判らない.

環境の上書き

Snow Leopard には,/usr/bin/emacs-21.2.1 という,いったいいつのだよ,という emacs が入っている.
こいつが呼び出されないよう, ~/.profile に細工する.

alias emacsclient='/Applications/Emacs.app/Contents/MacOS/bin/emacsclient'
alias emacs='open /Applications/Emacs.app'

ssh か何かで入った時には emacs がトチ狂いような気がするけれど,そのときは手動で unalias するからいいや.

--daemon を使わずに emacsclient を使う

Emacs 23系は,emacsclient を使うときに幸せになれるよう, --daemon オプションが追加になっている.
デフォルトのフォントでも気にならない人は,ログイン時にでも --daemon オプションで起動すればよいはず.

しかし,フォントを変えるよう init.el にゴニョゴニョしている人は,「error: Fontset `tty' does not exist」などいうエラーを喰らう.
ぐぐったところ,「(set-fontset-font)の前に(display-graphic-p) で判別するとエラーにならないよ」ということのよう.実際エラーは取れるのだけれど,emacsclient で起動したフレームにはデフォルトのフォントしか出てこない.

そこで,--daemon を使わない方法を考えた結果,バッドノウハウが一つ浮かんだ.
まず,.profile に下記の行を加えておく.

export ALTERNATE_EDITOR=~/bin/emacs.sh

この環境変数は,emacsclient が emacs を探せなかったときに呼び出すエディタを指定するためにある.これを使ってちょっとしたトリックを行う.
~/bin/emacs.sh は,下記のようにしておく.

#!/bin/sh
open -a Emacs.app
sleep 1
/Applications/Emacs.app/Contents/MacOS/bin/emacsclient $*

open コマンドは,起動をかけると直ぐに終了してしまうので,1秒のスリープを入れてある.1秒以内にEmacs が起動しない場合でも,次に実行される emacsclient が再び ~/bin/emacs.sh を呼び出すので,正常系では数秒以内に emacsclient の処理は成功する*1
これも,ssh などでログインして GUI の無い状態で作業すると破綻する.判別の方法があればよいのだけれど.

乗り換えた感想.

いくつかのファイルで query-replace や replace-regexp をやってみたところ,明らかに速いと感じる.また,通常の文字入力でも,少なくとも体感的には応答がよいようだ.IMEパッチの当たった dmg が無いので障壁は少し高いけれど,お勧め.

*1:異常系では,Emacs.app が壊れていて立ち上がらないというケースは有り得る.