2010-08-30

Cocoa Emacs を使ってみたい #2: SKK 自動ロードの仕組み

前回、SKK のインストールでつまづいていると書いた(→ Cocoa Emacs を使ってみたい)。いろいろと調べ(ググり)、あれこれ試して、ひとまず対処方法が決まった。

ちなみに、この記事は Cocoa Emacs (安定板) で書いている。

SKK インストールにおける問題点

紹介マニア」に書かれている手順にしたがい SKK を ~/.emacs.d/lisp にインストールした。しかし、(Cocoa Emacs を再起動して)C-x C-j を叩いても SKK が起動しない。C-x C-j is undefined と出るばかり。どうも、SKK がロードされていない上に、load-path 上に見つからない様子だ(SKK を load-library でロードしようとするとわかる)。

~/.emacs.d/lisp は別にデフォルトで load-path に入っているわけではないらしい。実際、上述のページの作者が公開している初期化ファイルを見ると、このディレクトリを load-path に追加するコードがあった。

~/.emacs.d/lisp/{apel,skk}load-path に追加すると、load-library で SKK を(手動で)ロードできるようになった。初期化ファイルで (require 'skk-autoloads) とやれば自動でロードできるようにもなった。

いや、でもまだおかしい。「紹介マニア」には「init.el に記述する必要はありません」と書かれているし、SKK (DDSKK 14.0.92) のマニュアルにも同様に書かれている。いったい、何が違うんだ?

SKK の自動ロードの仕組み

いろいろと調べた(ググった)結果、SKK が emacs の初期化ファイルの記述に関係なく自動ロードされるのは以下の仕組みであることがわかった。

  1. emacs は normal-top-level という関数の中で、load-path に設定されたディレクトリ(とそのサブディレクトリ)から leim-list.el というファイルを探し、ロードする。
  2. DDSKK は SKK のロードと基本的な設定を skk-setup.el というファイルに書き込み、これをロードするための (SKK専用の) leim-list.el を生成する。
  3. DDSKK のインストーラは、上記 2 のファイルを(他のファイルとともに) インストールする。

よって、SKK の leim-list.elnormal-top-level が見つけてくれれば、めでたく SKK が自動ロードが実現する。問題は normal-top-level の実行されるタイミングだ。emacs の初期化ファイル読み込みよりも後なら、初期化ファイル中で load-path に追加したディレクトリも探索の対象になる。一方、初期化ファイル読み込みよりも前なら探索してくれない。試してみたところ、どうも後者らしい。

Cocoa Emacs に SKK を自動ロードするようにインストール

SKK が自動ロードされるためには、leim-list.elskk-setup.el という 2 つのファイルが、デフォルトで load-path にふくまれているディレクトリに置かれていれば良い。

簡単かつ確実な方法は SKK (と APEL) を Emacs.app の中にインストールしてしまうことだ。

まず、APEL インストールの実行結果を示す。

[imac] mnbi% cd apel-10.8
[imac] mnbi% make install EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs
/Applications/Emacs.app/Contents/MacOS/Emacs -batch -q -no-site-file \
-l APEL-MK -f compile-apel \
  NONE NONE NONE
[...snip...]
LISPDIR=/Applications/Emacs.app/Contents/Resources/site-lisp
VERSION_SPECIFIC_LISPDIR=/Applications/Emacs.app/Contents/Resources/site-lisp
[...snip...]
install.elc -> /Applications/Emacs.app/Contents/Resources/site-lisp/apel

そして、DDSKK のインストールの実行結果はこうなる。

[imac] mnbi% cd ../ddskk-14.0.92
[imac] mnbi% sh make install EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs
/Applications/Emacs.app/Contents/MacOS/Emacs -batch -q -no-site-file \
-l SKK-MK -f SKK-MK-install
[...snip...]
leim-list.el -> /Applications/Emacs.app/Contents/Resources/site-lisp/skk
skk-setup.el -> /Applications/Emacs.app/Contents/Resources/site-lisp/skk
[...snip...]

SKK を自動ロードする仕組みというべき leim-list.elskk-setup.el が Emacs.app 内のにコピーされているのがわかる。

この方法の問題点は、Cocoa Emacs をビルドするたびに、SKK (と APEL) をインストールし直す必要がある、ということだ(コピーでごまかすこともできるが)。

安定板(23.2)の問題点

セカンドディスプレイにウィンドウを置くと、top の位置がおかしい

ウィンドウを一番上に置いた状態で、frame-parameters を使って表示させると (top . 160) となる。正しくは (top . 0) となるべき。実際、Carbon Emacs ではそうなる。

そのくせ、初期化時に default-frame-alist(top . 160) を設定すると、ウィンドウが下にずれる。表示だけが間違っているということか?

ウィンドウの高さに制限がかかる

これはバグだとは言えないが、少し困る。

初期化ファイル中で default-frame-alistheight を設定する方法だと、ウィンドウの高さをセカンドディスプレイいっぱいにできないようだ。現在のフォントの設定だと最大 92 行のウィンドウにできるはずが、初期化時には 76 行相当になってしまう。この 76 行が どうやらメインディスプレイ側での最大の高さになっているらしい(27 インチの高さからメニューとドックの高さを除いた分)。つまり、Cocoa Emacs 起動時にはウィンドウがメイン側で開くため、その大きさで制約がかかってしまう、ということ。実際、シネマ側にウィンドウが移動してから新しいウィンドウを開く(C-5-2)と 92 行になる。

これって回避策はあるのか?

Cocoa Emacs は AppleScript に反応しないようだから、起動後に AppleScript で操作することもできない。今のところ、起動後に手作業で広げるしかない。ウチでは Emacs は Safari 等と同様、基本立ち上げっぱなしだから我慢できないわけでもない。

その他、覚え書き

前回(→ Cocoa Emacs を使ってみたい)で、64 ビットを使いたいから開発版をビルドするゾ、と書いた。あれから確認してみたところ、安定板(23.2)も 64 ビットでビルドされていた(アクティビティモニタ.app で確認)。

他にもやりかけのことがあるし、「Emacs テクニックバイブル」も気になるし、Cocoa Emacs の開発版に手を出すのは少し先になりそうだ。

関連リンク

関連記事

0 件のコメント:

コメントを投稿