Emacs 24.0.50: Aspell filter error, fontset

サーバ機 FreeBSD 8.0-RELEASE にインストールした Emacs 24.0.50 でもロシア語メールを書く必要が発生し,メールエージェント Mew, スペルチェッカ Aspell をセットアップした。前に書いたメモ『Meadow 3.01-dev, GNU Aspell 多言語環境(露・英・仏・独)』に従って Emacs - Aspell 環境を準備したのだが,flyspell-mode (入力の都度スペルチェックが自動で行われるモード) を起動すると,Error: The filter "nroff" does not exists なるエラーが出てスペルチェッカが使えない。

調べたところ,Aspell-0.60.6 では filter-mode がサポートされていて,例えば tex filter を使えば LaTeX の命令のスペルチェックをスキップしてくれるのだが,インストールの仕方によっては nroff などの filter が組込まれないらしい。そのくせ,これを要求しに行って,上記のエラーになったようである。

対策は各種フィルタを付加すること。FreeBSD 8.0-RELEASE で私が Aspell を再導入した場合では,./configure --enable-compile-in-filters で生成した Makefile で組込めば OK になった。

もし同じエラーが出てかつ再インストールが面倒なら,filter 使用設定を外す。すなわち,.emacs の Aspell 起動オプション設定に --mode=none(filter なし)を指定すればよい。以下のように書いておく。

(setq ispell-extra-args '("--sug-mode=ultra" "--encoding=UTF-8" "--mode=none"))

現在の Aspell にどんな filter がインストールされているかは,aspell dump filters とコマンド発行すれば確認できる。私の環境では当初 url filter しか組込まれていなかったが,再インストールで,email, html, sgml, context, url, nroff, tex, texinfo の各種フィルタが認識されるようになった。
 

* * *

Emacs 24.0.50 でメールを書くに際していまひとつ問題があった。fontset-standard で起動してもキリル文字で日本語フォント(要するに全角文字)が拾われて極めてみっともないのだ。なんて Emacs は面倒なんだ!

しようがないので,いちいち set-charset-priority (文字コードの優先順位), set-fontset-font (文字コードに応じたフォント設定) を指示しなければならなかった。フォント名(IPAGothic など)は,fc-list コマンドの出力からユーザの好みのものを指定する。備忘録として .emacs のその部分を掲載しておく。

;;
;; charset priority
;;
(set-charset-priority
 'cyrillic-iso8859-5
 'greek-iso8859-7
 'mule-unicode-0100-24ff
 'japanese-jisx0208
)
;; char width for Mew Summary
;;; iso 8859-5
(map-charset-chars
 (lambda
   (range ignore)
   (set-char-table-range char-width-table range 1))
 'cyrillic-iso8859-5)
;;; iso 8859-7
(map-charset-chars
 (lambda
   (range ignore)
   (set-char-table-range char-width-table range 1))
 'greek-iso8859-7)
 
;;
;; font face
;; - See output of fc-list command for fontname.
;;
(set-face-attribute 'default nil
            :family "DejaVu Sans Mono"
            :height 100)
;; japanese
(set-fontset-font
 (frame-parameter nil 'font)
 'japanese-jisx0208
 '("IPAGothic" . "iso10646-1"))
(set-fontset-font
 (frame-parameter nil 'font)
 'katakana-jisx0201
 '("IPAGothic" . "iso10646-1"))
(set-fontset-font
 (frame-parameter nil 'font)
 'japanese-jisx0212
 '("IPAGothic" . "iso10646-1"))
;; Unicode
(set-fontset-font
 (frame-parameter nil 'font)
 'mule-unicode-0100-24ff
 '("DejaVu Sans Mono" . "iso10646-1"))
;; cyrillic
(set-fontset-font
 (frame-parameter nil 'font)
 'cyrillic-iso8859-5
 '("DejaVu Sans Mono" . "iso10646-1"))
;; greek
(set-fontset-font
 (frame-parameter nil 'font)
 'greek-iso8859-7
 '("DejaVu Sans Mono" . "iso10646-1"))