本家Emacs 22.1のソースにIMEパッチをあててWindows用にbuildしてみた記録

はじめに・Emacsとは

まず、Emacsってなんじゃ? という方のために、簡単にEmacsの紹介を。Emacsっていうのは、文字編集のためのソフト「エディター」で、主にプログラムを書いたりするのに使うソフト。

プログラム編集のための便利な機能が満載されているのは当然として、カレンダー、電卓、日の出・日の入り時刻表示をはじめとする、(どうでもいいような)アクセサリーも満載。暇つぶし(いや、生産性向上のための気分転換用か?)のゲームまで入っている。(参考: Mac OS Mac OS Xの「ターミナル」に隠されたゲームで遊ぶ方法)

さらに、ヘルプメニューには悩みを相談する人工知能(正確に言うと、擬似人工知能 = 人工無能)の「精神科医」まで搭載されている。MacOS Xにはもれなくemacsが入っているので、Macを持っている人は、上記のゲームのページで紹介されている方法と同じように操作して、「tetris」の代わりに、「doctor」と入れると、いつでも精神科医との対話を体験できる。(英語限定だけど) (参考: doctorの会話例)

以下では、このEmacsWindows用にビルドしてみた記録を紹介する。

NTEmacsIMEパッチ入りバイナリ

Windowsで使えるEmacsといえば、Meadowが有名だが、NTEmacsというのもあるらしい。(というか、本家のEmacsWindowsでそのままbuildできるようだ) このバイナリは以下のサイトから入手することができる。

これをダウンロードすれば用事は済むんだけど、今回は自分でビルドしてみることにした。(ちなみに本家のダウンロードサイトからも、Windows用のバイナリを得ることができるが、これだとIMEの入力が変になってしまう)

自分でビルドしてみようと思った理由

  • 半透明パッチの入ってないバイナリが欲しかった
  • Cygwinを使わないでビルドしたかった
  • Emacs公式サイトで配布されているstableのソース "emacs-22.1.tar.gz" にパッチを当てたバイナリがほしかった
  • Meadowじゃないのを使ってみたかった

(NTEmacs JP ProjectのバイナリやソースのビルドにCygwinが必要なのかどうか、また、そのソースがemacs-22.1.tar.gzに基づいているのかどうかはよくわからないのですが。たぶん、バイナリを動かすのにCygwinは必要ないんだろうと思うけど。ま、やってみたかったということで)

NTEmacs22 CVS IME.patch を Build する を参考にしました。これとほぼ同一の手順。

ちなみに私は、Cのソースは「うっすら読める程度」 ./configure & makeは最近何年もしてないなー、という、ど素人。つまり、「やらなくてもいい余計な作業」をしていても、本人気付いてない可能性もありますのでご注意を。(何か変なことしてたら教えてください)

環境設定

まず、ビルドする環境を整えます。

まず、MinGWをインストール。

MinGWのサイトのダウンロードコーナーから、「Current」の「MinGW」を選んでインストーラーをインストール。今回は "MinGW-5.1.3.exe" を使用。

次にMSYSをインストール

MinGWと同じ場所、ここからMSYSをダウンロード。今回は、"MSYS-1.0.10.exe" を使用。

パスを通す

MSYSを使うと、それっぽいshellが動くんだけど、Windowsコマンドプロンプトからいじったほうがよさそうだ、と直感的に思ったので、MSYSと、MinGWのバイナリへのパスを手動で通す。

Path=C:\dev\msys\1.0\bin;C:\dev\MinGW\bin;C:\WINDOWS\system32;……(以下略)

画像関係のライブラリを入れる

GnuWin32 Packages から、いくつか、ファイルをダウンロードしてきて入れる。

  • jpeg-6b-4.exe
  • libpng-1.2.8.exe
  • libungif-4.1.4-1.exe
  • tiff-3.8.2-1.exe
  • xpm-3.5.1-1.exe

まず、これらのファイルをインストールし、

  • ...Program Files\GnuWin32\include の中にヘッダファイルがインストールされるので、それを丸ごと ...MinGW\include にコピーする
  • ...Program Files\GnuWin32\libの中の、拡張子 「a」 のファイルを ...MinGW\lib にごそっとコピー。

で、さらに、

  • zlib123-dll.zip をダウンロード。USAGE.txtを読みながら、"zlib.h" と"zconf.h"を...MinGW\include にコピー、また、"zdll.lib"のファイル名を"libzdll.a"に変更し、...MinGW\libにコピー。
  • xpm-3.5.1-1-src.zipをダウンロード。中の、simx.hを..MinGW\include にコピー。

これは後述のconfigure.batで以下のようなメッセージが出るのの対策。(XPM非対応だとツールバーなどが白黒でしょぼくなる模様)

Checking for libXpm...
...X11/xpm.h not found, building without XPM support.

ソースの準備・patchあてと修正

ソースコードをダウンロード。こちらemacs-22.1.tar.gz。それにunicode用じゃないpatchをあてる。こちらのページから頂戴する。ありがたや(拝む)

patch -p0 < ../emacs-cvs-20070224-IME.patch

私が試した環境では問題が発生したので、src/w32term.hのRECONVERTSTRING構造体のところを修正。

#ifndef HAVE_RECONVERTSTRING

/*
typedef struct tagRECONVERTSTRING {
  DWORD dwSize;
  DWORD dwVersion;
  DWORD dwStrLen;
  DWORD dwStrOffset;
  DWORD dwCompStrLen;
  DWORD dwCompStrOffset;
  DWORD dwTargetStrLen;
  DWORD dwTargetStrOffset;
} RECONVERTSTRING, *PRECONVERTSTRING;

*/

#endif

「#if 0 …… #endif」とかすればよかったのかな? よくわからないのでコメントアウト。make時に、以下のようなエラーが出るのの対策。

In file included from w32fns.c:57:
c:/dev/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/imm.h:279: error: redefinition of `struct tagRECONVERTSTRING'
make[2]: *** [oo-spd/i386/w32fns.o] Error 1

ntemacs-jpと違うところ

ソースにpatchをあてて、NTEmacs JP Projectさんで公開されているソースのアーカイブと比較してみたところ、lisp/loadup.elの以下の違いが気になったので、一行追加。追加することで何がどう違ってくるのかは不明。やらなくてもいいかもしれない。

(if (eq system-type 'windows-nt)
    (progn
      (load "ls-lisp")
      (load "disp-table") ; needed to setup ibm-pc char set, see internal.el
これ追加→      (load "international/meadow-ntemacs")
      (load "dos-w32")
      (load "w32-vars")
      (load "w32-fns")))

configure / make / install

バイナリをbuildして、インストールする。Windowsコマンドプロンプトで、以下のように入力。

emacs-22.1\nt>configure.bat --cflags -DIME_CONTROL --cflags -DRECONVERSION

emacs-22.1\nt>make bootstrap

emacs-22.1\nt>make install INSTALL_DIR=c:/dev/emacs

……とすると、c:/dev/emacsのなかに、バイナリが一式インストールされる。

..\Program Files\GnuWin32\binの中に入ってる画像関係のdllファイルを、インストールされたemacsのbinディレクトリの中にコピーする。

ここに書いてある、「作動の確認」でちょっとつまづいた。

(eval 'image-types)[Ctrl]+Jを押して評価
↓
(png gif tiff jpeg xpm xbm pbm)

'image-type「s」のはず。

フォントの設定

BDFフォント、intlfontsをインストール。インストールといっても、ファイルを伸張・展開しただけ。設定に関しては、本家のサイトに、色々貴重な情報が。 http://www.gnu.org/software/emacs/windows/faq5.html でもこれだとちょっと足りない。

2ちゃんねるNTEmacsスレッドの、 >>627から>>629までが非常に参考になった。(どうもありがとう!) 念の為再掲

(setq bdf-directory-list
      '("x:/emacs/intlfonts/Asian"
	"x:/emacs/intlfonts/Chinese"
	"x:/emacs/intlfonts/Chinese.BIG"
      (途中略)
	"x:/emacs/intlfonts/Chinese.X"
        "x:/emacs/intlfonts/Misc"))

(setq w32-bdf-filename-alist
      (w32-find-bdf-fonts bdf-directory-list))

(create-fontset-from-fontset-spec
    "-*-fixed-Medium-r-Normal-*-16-*-*-*-c-*-fontset-bdf,
    ascii:-ETL-Fixed-Medium-R-Normal--16-160-72-72-C-80-ISO8859-1,
    latin-iso8859-2:-*-Fixed-*-r-*-*-16-*-*-*-c-*-iso8859-2,
    latin-iso8859-3:-*-Fixed-*-r-*-*-16-*-*-*-c-*-iso8859-3,
    latin-iso8859-4:-*-Fixed-*-r-*-*-16-*-*-*-c-*-iso8859-4,
    cyrillic-iso8859-5:-*-Fixed-*-r-*-*-16-*-*-*-c-*-iso8859-5,
    greek-iso8859-7:-*-Fixed-*-r-*-*-16-*-*-*-c-*-iso8859-7,
    latin-iso8859-9:-*-Fixed-*-r-*-*-16-*-*-*-c-*-iso8859-9,
    mule-unicode-0100-24ff:-Efont-Biwidth-Medium-R-Normal--16-160-75-75-P-80-ISO10646-1,
    mule-unicode-2500-33ff:-Efont-Biwidth-Medium-R-Normal--16-160-75-75-P-80-ISO10646-1,
    mule-unicode-e000-ffff:-Efont-Biwidth-Medium-R-Normal--16-160-75-75-P-80-ISO10646-1,
    japanese-jisx0208:-JIS-Fixed-Medium-R-Normal--16-150-75-75-C-160-JISX0208.1983-0,
    japanese-jisx0208-1978:-Misc-Fixed-Medium-R-Normal--16-150-75-75-C-160-JISC6226.1978-0,
    japanese-jisx0212:-Misc-Fixed-Medium-R-Normal--16-150-75-75-C-160-JISX0212.1990-0,
    latin-jisx0201:-*-*-medium-r-normal-*-16-*-*-*-c-*-jisx0201*-*,
    katakana-jisx0201:-Sony-Fixed-Medium-R-Normal--16-120-100-100-C-80-JISX0201.1976-0,
    thai-tis620:-Misc-Fixed-Medium-R-Normal--24-240-72-72-C-120-TIS620.2529-1,
    lao:-Misc-Fixed-Medium-R-Normal--24-240-72-72-C-120-MuleLao-1,
    tibetan:-TibMdXA-fixed-medium-r-normal--16-160-72-72-m-160-MuleTibetan-0,
    tibetan-1-column:-TibMdXA-fixed-medium-r-normal--16-160-72-72-m-80-MuleTibetan-1,
    korean-ksc5601:-Daewoo-Mincho-Medium-R-Normal--16-120-100-100-C-160-KSC5601.1987-0,
    chinese-gb2312:-ISAS-Fangsong ti-Medium-R-Normal--16-160-72-72-c-160-GB2312.1980-0,
    chinese-cns11643-1:-HKU-Fixed-Medium-R-Normal--16-160-72-72-C-160-CNS11643.1992.1-0,
    chinese-big5-1:-ETen-Fixed-Medium-R-Normal--16-150-75-75-C-160-Big5.ETen-0,
    chinese-big5-2:-ETen-Fixed-Medium-R-Normal--16-150-75-75-C-160-Big5.ETen-0
    " t)

(setq font-encoding-alist
      (append '(
		("JISX0208" (japanese-jisx0208 . 0))
		("JISX0212" (japanese-jisx0212 . 0))
		("CNS11643.1992.1-0" (chinese-cns11643-1 . 0))
		("GB2312" (chinese-gb2312 . 0))
		("KSC5601" (korean-ksc5601 . 0))
		("VISCII" (vietnamese-viscii-lower . 0))
		("MuleArabic-0" (arabic-digit . 0))
		("MuleArabic-1" (arabic-1-column . 0))
		("MuleArabic-2" (arabic-2-column . 0))
		("muleindian-1" (indian-1-column . 0))
		("muleindian-2" (indian-2-column . 0))
		("MuleTibetan-0" (tibetan . 0))
		("MuleTibetan-1" (tibetan-1-column . 0))
		) font-encoding-alist))

(setq default-frame-alist
(append
'((font . "fontset-bdf"))
default-frame-alist))

実際には、(w32-find-bdf-fonts bdf-directory-list)のところで時間がかかるので、scratchバッファで一旦上記のコードを評価し、C-h vで、w32-bdf-filename-alistの値を調べ、それをコピペして使っている。

BDFフォントを使わない場合は、NTEmacs 22.1 のフォント設定 が非常に参考になる。(「carbon-font.el」とあるのは、ntemacs-font.elのことだと思うけど)

ただ、うちで試したところ、Windowsのフォントを使うと、色々打ってるうちに、ごくまれに一部の字が表示されなくなる(C-lでまた表示される)という現象が発生した。BDFフォントの場合は、そういう症状は(今のところ)でていない。

ここまでで、とりあえず、以下のように動作。

一部表示されてない字もあるけど、とりあえず、日中韓に、タイ語、北欧の字が出れば当座困ることは無いと思うので、これで満足することにする。(ツールバーの高さが微妙に大きいような気がして気になってるんだけど放置)

その他の設定

Alt+漢字を無視

手癖で、Alt+漢字を押してしまって、音がするので以下のように設定。

(global-set-key [M-kanji] 'ignore)
ホームディレクト

ホームディレクトリ( .emacsを置く場所)が、何も設定しないと「C:\Documents and Settings\[ユーザ名]\Application Data」になる。参考: Windows HOME - GNU Emacs Manual

環境変数HOMEを設定してやるのが一番簡単だと思うが、ちょっと調べてみた感じだと、ソースのw32.cで、get_folder_pathってのを使って上記のディレクトリを得ているようなのでそこらへんをいじるとカスタマイズできそう。ここを見ると、ソース中で「CSIDL_APPDATA」となっている部分をCSIDL_PERSONALとすると、マイドキュメントに、CSIDL_DESKTOPDIRECTORYでデスクトップになるのかな。(未確認)

行間が詰まる

default-frame-alistに色々設定するところでline-spacingというのを設定すると、見やすくなる様子

とりあえず、以上。これで何日か使ってますが、いまのところ快調。なにかあったら追加します。