2011年8月17日水曜日

HomebrewでCocoa Emacs 23.3aをインストールした

(追記)HomebrewでCocoa Emacs 24.2をインストールした。

少し前にMacBook Pro 13インチ (Early 2011)を購入して、いろいろと設定するついでに、これまで使ってきたCarbon EmacsからCocoa Emacs (Emacs 23)へ移行することにした。最初はバイナリで簡単にインストールできると思っていたけど、日本語入力が完全ではないようでパッチを当てたほうがいいことがわかった。パッケージ管理はHomebrewで行っているのだけど、Formulaを書き換えることでパッチの追加も簡単にできるし、EmacsもHomebrewでインストールすることにした。

パッチについて

パッチはいろいろ公開されているけど、日本語入力を快適にするためのインラインパッチ(IMEパッチ)は必須のようだ。また、インラインパッチのバグを修正するパッチがCocoa Emacs が落ちるで公開されているので使わせて頂く。

さらに、feature-fullscreen.patchも定番らしい。これはM-x ns-toggle-fullscreenでEmacsがフルスクリーンになる機能を追加する。同じリポジトリでfix-shiftmodifier-with-ime.patchも公開されていて、こちらは日本語IMEでShiftが使えない問題を修正する。これはインラインパッチが提供する機能で回避した方がいいらしいので使わないことにする。

Homebrewでインストール

HomebrewでFormulaを編集するには

$ brew edit emacs

のようにする。Formulaを開いた状態で$EDITORが立ち上がるので書き換えて保存すればいい。

実際にFormulaを開いて気付いたのだけど、すでにfullscreen patchは含まれている(バージョンは23.3a)。ということで、必要なのはインラインパッチとそのバグを修正するパッチ、あと宣言と定義で引数の型が違ってコンパイルエラーになってしまう部分があったので、それを修正するパッチも追加した(Xcodeのバージョンは3.2.6)。

最終的にpatchesメソッドは次のようになった。

(2011/11/12 追記)最新のFormulaに合わせて修正(バージョンは23.3aのまま)。Fix for Shift key ...はインラインパッチとかぶるのでコメントアウトした。

def patches
  p1 = []
  p0 = []

  # Fix for building with Xcode 4; harmless on Xcode 3.x.
  unless ARGV.build_head?
    p1 << "http://repo.or.cz/w/emacs.git/commitdiff_plain/c8bba48c5889c4773c62a10f7c3d4383881f11$
    # Fix for address randomization on Darwin. Based on:
    #   http://repo.or.cz/w/emacs.git/patch/f2cea124dffac9ca4b8ce1dbb9b746f8e81109a3
    p1 << "https://raw.github.com/gist/1098107"
    # Fix for the titlebar issue on Mac OS X 10.7
    p1 << "https://raw.github.com/gist/1102744"
    # Fix for Shift key for IME users
    #p1 << "https://raw.github.com/gist/1212776"
  end

  if ARGV.include? "--cocoa"
    # Fullscreen patch, works against 23.3 and HEAD.
    p1 << "https://raw.github.com/gist/1012927"

    p0 << "http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Fmacemacsjp%2F47986%2Finline_patch-23.2-beta3.tar.gz"
    p0 << DATA
  end

  return { :p1 => p1, :p0 => p0 }
end

Hashを返すと:p1の値はpatch -p1に、:p0の値はpatch -p0に渡される。

さらに、ファイルの一番最後に以下を追加する。

__END__
diff -U0 src/macim.m.orig src/macim.m
--- src/macim.m.orig
+++ src/macim.m
@@ -42 +42 @@
-int mac_pass_key_to_system (int code, UInt32 modifiers);
+int mac_pass_key_to_system (int code, unsigned modifiers);
diff -U0 src/nsterm.m.orig src/nsterm.m
--- src/nsterm.m.orig
+++ src/nsterm.m
@@ -3959 +3959 @@
-  if (mac_store_change_input_method_event())
+  if (emacs_event && mac_store_change_input_method_event())

Rubyでは、__END__以降はスクリプトとしては認識されず、DATAという定数でファイルオブジェクトとして扱うことができる。

Formulaの編集が終わったら次のようにしてインストールする。Emacs.appは、/usr/local/bin/emacsなどのシンボリックリンクが切れてしまうけど、自分はターミナルで使用することはないのでmvした。

$ brew install emacs --cocoa
$ mv /usr/local/Cellar/emacs/23.3a/Emacs.app /Applications

初期設定

最低限必要な設定は以下の通りで、2行目が日本語IMEのShiftの問題を回避する。

(setq default-input-method "MacOSX")
(mac-add-key-passed-to-system 'shift)

デフォルトではOptionキーがMetaになっている。CommandキーをMetaとして使うためにOptionキーと入れ替える。

(setq ns-command-modifier (quote meta))
(setq ns-alternate-modifier (quote super))

ドラッグ&ドロップでファイルを開く。2行目は新しいウィンドウで開くのを防ぐため(Cocoa Emacs で dnd - Think Different - はてな版)。

(define-key global-map [ns-drag-file] 'ns-find-file)
(setq ns-pop-up-frames nil)

円記号の代わりにバックスラッシュを入力する。ただし、delete-horizontal-spaceなどのキーバインディングで、M-¥ is undefinedなどと表示されてしまう。

(mac-translate-from-yen-to-backslash)

フォント設定はこちらのページが参考になる。