Emacs-CVS 23.1.50 インストール, flyspell

Mac OS X Tiger 10.4.11,X11 環境の GNU Emacs(22.0.50)において,ロシア語テキストの flyspell-mode(単語入力と同時にスペルチェックし,ミスがあると修飾表示してくれるモード)設定をしたところ,"Symbol's function definition is void: ispell-maybe-find-aspell-dictionaries" というエラーが出てスペルチェックができない。ispell-buffer などは OK である。調べたところ,どうも Emacs の新しい版では訂正されているとのことであった。そこで,意を決して久々に CVS から Emacs を構築することにした。バージョンは 23.1.50.2(ChangeLog 最新日付は 2009.8.15)。

ところが,Mac OS X でのコンパイル,起動確認は厄介だった。オープンソース・プログラムの構築では,ユーザーの環境により様々な問題が出る可能性があり,一様ではないだろうけれども,私と同じ問題に遭遇した人のために,その問題と対処メモをしるしておく。

まずは Emacs CVS リポジトリ http://savannah.gnu.org/cvs/?group=emacs からローカル・ワークにチェックアウトする。続いて,configure スクリプトを実行し,make。

% cd ~/tmp
% setenv CVS_RSH ssh
% cvs -z3 -d:pserver:anonymous@cvs.savannah.gnu.org:/sources/emacs co emacs
% ./configure --with-x
% make bootstrap

ftfont.c のコンパイルで問題が出た。'FC_WEIGHT_REGULAR' undeclared や 'FC_WIDTH' undeclared といったエラーが出て停止する。これは GTK+2 ライブラリがないために出るようである。Version-23 から GTK+2 を使うようになったらしい。そこで,このライブラリをインストールした。今回は source tar ball からではなく,EasyPackage インストーラで Tiger 用バイナリを導入した。x11-toolkits 分類から gtk+2 をダブルクリックするだけ。いとも簡単。これで再度 make をしてコンパイルは完了した。sudo make install でインストールは終了。

次にいよいよ Emacs を起動したところ,次のようなエラーで Emacs が abort した。

Error reading Pango modules file
 
(emacs:24574): Pango-CRITICAL **: _pango_engine_shape_shape: assertion
`PANGO_IS_FONT (font)' failed
 
Pango-ERROR **: file shape.c: line 75 (pango_shape): assertion failed: 
(glyphs->num_glyphs > 0)
aborting...

Pango ってなんじゃ? これはフォントのレンダリングでアンチエイリアス表示をする仕組みのようである。こんなんいらんのにと,configure オプションを調べなおしたりしたが,抑止できるオプションがなさそうであった。でも /usr/local/lib,/opt/local/lib の下を確認すると,libpango* のライブラリがすでにインストールされており,設定の問題らしいことがわかった。Google で検索した結果,pango.modules の設定がよろしくない。これを作りなおすコマンド pango-querymodules を実行すればうまくいった。

# cd /usr/local/etc/pango
# pango-querymodules > pango.modules

Emacs のコンパイルでトラブルは毎度のこと。どうしてこんなに面倒なのか。FreeBSD ports や Mac Carbon-Emacs dmg,Mac Darwin ports を利用して構築することを強く推奨する。こんなことで時間を浪費するのは,スキ者に任せておくべきである。

flyspell もばっちり OK になった。これを契機にロシア語スペルチェック環境を改善した。ロシアの KOSTAFEY 氏によるブログ "KOSTAFEY'S BLOG" 2009.7.28 日の記事 Emacs, Aspell и одновременное использование словарей を参考に .emacs から以下の elisp を読込むようにした(つまり (load-file "~/elisp/aspell.el") を追加した)。これは text mode で自動的にロシア語用 flyspell が起動し,カーソル上の単語にスペルミスがあれば赤色・下線付きで強調表示してくれる。C-F1 キーで ispell-word 関数(カーソル上の単語チェック),C-F2 キーで ispell-region 関数(指定範囲のチェック),C-F3 キーで ispell-buffer 関数(バッファ全体のチェック)が起動し,スペルチェックが出来る。flyspell-english 関数と flyspell-russian 関数によって,英語とロシア語の切替えが出来るようになっている。ispell-change-dictionary 関数で辞書を切替えてもよい。辞書はデフォルトをロシア語にしてある。もちろん,GNU Aspell とロシア語辞書を予めインストールしておく必要がある。ru-yeyo とは,е(イェ)と ё(イョ)どちらの綴りにも対応したロシア語辞書指定である。

;; -*- coding: utf-8; -*-
;; aspell.el
;;
;; Настройка проверки правописания Ispell
;; From http://kostafey.blogspot.com/2009/07/emacs-aspell.html
;;
;; .emacs に (load-file "hoge/aspell.el") を指定して読み込ませる。
;;
(require 'flyspell)
(require 'ispell)
(setq
 ispell-program-name "/usr/local/lib/aspell-0.60/ispell" ;; aspell path
 ispell-dictionary-alist 
 '(("english"                       ; English
    "[a-zA-Z]" 
    "[^a-zA-Z]" 
    "[']" nil ("-d" "en") nil iso-8859-1)
   ("russian"                       ; Russian
    "[АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя]"
    "[^АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя]"
    "[-]" nil ("-d" "ru-yeyo") nil utf-8)
   (nil                             ; Default
    "[A-Za-z]"
    "[^A-Za-z]"
    "[']" nil ("-C") nil iso-8859-1)
   )
 ispell-russian-dictionary "russian"
 ispell-english-dictionary "english"
 flyspell-default-dictionary ispell-russian-dictionary
 ispell-dictionary ispell-russian-dictionary
 ispell-local-dictionary ispell-russian-dictionary
 ispell-extra-args '("--sug-mode=ultra" "--encoding=UTF-8") ;; added
)
;; Russian
(defun flyspell-russian ()
  (interactive)
  (flyspell-mode t)
  (ispell-change-dictionary ispell-russian-dictionary)
  (flyspell-buffer)
  (message "Russian dictionary - Spell Checking completed."))
;; English
(defun flyspell-english ()
  (interactive)
  (flyspell-mode t)
  (ispell-change-dictionary ispell-english-dictionary)
  (flyspell-buffer)
  (message "English dictionary - Spell Checking completed."))
;; ハイライト表示フェース
(setq ispell-highlight-face 'flyspell-incorrect)
;; テキスト編集モードで flyspell 自動起動
(add-hook 'text-mode-hook 'flyspell-mode)
;; check 前にウェイト 1 秒
(setq flyspell-delay 1)
;; short hands
(global-set-key [(control f1)] 'ispell-word)
(global-set-key [(control f2)] 'ispell-region)
(global-set-key [(control f3)] 'ispell-buffer)

Cygwin 環境で Aspell を組込めば,これとほぼ同じ設定で Windows Meadow-3.01dev においても,flyspell,ispell-buffer,ispell-region,ispell-word が動作する(修正点は aspell のパス)。ただし,Meadow Netinstall で ispell パッケージを組み込んでいる場合,%MEADOW%\packages\pkginfo\ispell フォルダに格納される auto-autoloads.el の定義が上記 aspell 用 elisp との相性が悪く(おそらく,この auto-autoloads.el は英単語チェックしか考慮していない設定になっていて,上記 aspell.el 設定と矛盾するためだろう),ispell-buffer と ispell-region がうまく動作しない。対策として ispell フォルダを pkginfo から外す必要があるので注意。(さらにもうひとつ。Windows Cygwin 環境でも aspell 辞書をインストールするには,アーカイブを解凍してできる辞書データを aspell 辞書フォルダにコピーするだけでは不十分である。必ず,./configure; make; make install オペレーションを実施して,*.rws ファイルをインストールする。)

Windows Meadow で aspell を使う場合,もう一点,注意事項がある。スペルチェック中綴誤りのある単語について aspell が問い合わせを行うバッファ・フレームのモードラインのロシア語が,デフォルト状態では「豆腐」で出力されてしまう。これは inactive なモード行のフォント設定がデフォルト・フォントであるために,キリル文字が表示できない事情による。Meadow 多言語フォント・パッケージ mule-fonts を導入しているなら,M-x set-face-font RET modeline-inactive RET mule-fonts16 RET として,mule-fonts16 に fontset をインターラクティブに変更するか,mule-fonts パッケージの auto-autoloads.el の最後に (set-face-font 'modeline-inactive "mule-fonts16") を追加する。キリル文字を含む多言語用の fontset を Meadow に定義しているなら,mule-fonts16 でなくその fontset 名を代わりに指定してもよい。

Emacs の苦労多き構築作業が終わったあとになって,flyspell の訂正版が出ていることが判明。なにも Emacs-CVS の追っかけをやる必要はなかったのだった。Manuel Serrano 氏の flyspell ページから flyspell-1.7o.el をダウンロードし,FreeBSD の Emacs 22.0.90 lisp/textmodes/flyspell.el をこれに入れ替えたら,きちんと動作するようになった。トホホ。

でも Emacs-23 にバージョンアップしてよかった点がひとつある。Unicode 文字合成機能(文字にアクセント記号を後置すると合成して表示する。タイ語などでは必須の機能)がやっとサポートされたことである。

※ 2010/01/11 付記
Emacs の最新 trunk は,2009 年末,ここでしるしている cvs から bzr (bazaar) にバージョン管理が変更された。もう cvs は適用できないので注意。