Meadow 3.01-dev, GNU Aspell 多言語環境(露・英・仏・独)

外国語で文書を作成する際,なくてはならないのがスペルチェッカである。私は FreeBSD において,GNU Emacs 上で ispell + ロシア語辞書を昔から愛用してきた。Emacs は,比較的容易な設定変更で多言語スペルチェックもできるという意味で,秀丸,サクラ,WZ など日本で圧倒的に支持されている和製テキストエディタが太刀打ちできないくらい強力である。これこそ世界中の人々によって鍛えられている強みである。UNIX 文化の典型である Emacs は,ドキュメントをよく読まないと使いこなすのは難しい。しかし,外国語テキスト抜きでは計算機生活ができないユーザーにとって Emacs は,苦労も多いが得られることも多大なソフトウェアなのである。

最近,Unicode でテキストファイルを作成することが一般的になりつつある。Emacs 上で用いるスペルチェッカについても,UTF-8 テキストを取り扱うことのできる GNU Aspell を Emacs 付属の lisp プログラム ispell.el からドライブする形態で,スペルチェックを行う方式が主流のようである。

一般に日本語サイトでは,Emacs スペルチェッカ環境の整備方法について英語に関するリソースばかりで,ロシア語のような ASCII 範囲外の文字を使用する言語に関する活用情報を見かけることが極端に少ない。あったとしても,設定内容に踏み込んだ説明がまったくなく,応用の効かないものが多い。

そこで本稿では,もう少し言語を増やして環境構築を行う方法をしるす。UTF-8 エンコーディングで文書を作成しつつ,ロシア語,英語,フランス語,ドイツ語を切替えて利用できるようにするための導入記録である。先日,Mac OS X Tiger での Emacs-CVS 23.1.50 のインストールメモを書き,GNU Aspell のロシア語環境についても合わせて触れた。本稿の記述はこれと一部重複するところがある。

圧倒的シェアを誇る Windows 環境で説明する。Windows で動作する GNU Emacs である Meadow 開発最新版 3.01-dev から,Aspell-0.60 を使う前提である。私の試したのは Windows XP SP3 である。Windows Vista でもほぼ同じオペレーションで導入できるものと考える。露・英・独・仏語で Aspell を使えるようにすれば,第二外国語として多くのひとが選択する外国語をカバーするわけで,私のような「特殊辺境言語」ロシア語を学ぶ者のみならず,いろんな方の役に立つと考える。英語は標準であるとしても,その他の辞書とその設定は必要なものを選択すればよいように説明するつもりである。

Meadow で Aspell を使うには Cygwin 環境でインストールしたモジュールを使うのがよい。Aspell には Win32 ネイティブで動作する版も存在するが,辞書の追加のし易さから,ここでは Cygwin 版(Cygwin 用というのではなく,単に Cygwin 環境で make された Aspell パッケージと理解してほしい)を前提とする。Cygwin とは簡単にいえば Windows で動作する UNIX 疑似環境である。

以下の説明では Meadow のコマンド操作は Emacs の伝統的表記を用いている。C-x は Ctrl + x キー,M-x は Alt + x キー(Esc のあとに x キー押下でもよい),RET はリターンキーを示している。

  1. Cygwin の導入

    以下の Aspell 利用環境の構築の前に,Cygwin パッケージをインストールしておく。セットアップ・プログラム setup.exe をダウンロード・実行し,指示に従って行けば,簡単にインストールできる。 Cygwin インストーラはパッケージ選択メニューから同時にインストールするソフトウェアを選択できる。このとき,Aspell(0.60.5-1)GNU Make(3.81-2)Wget にチェックを付けてインストールしておく。その他,GNU C/C++ コンパイラ(gcc4-core 4.3.2,gcc4-g++ 4.3.2)も入れておきたい。本稿では Cygwin を C:\cygwin にインストールしたものと仮定して説明をする。別の場所にした場合は読み換えること。

    Cygwin のインストールが終了したら,ユーザーのホームディレクトリを決めて,そのフォルダ・パスを環境変数 HOME に登録しておく(「システム」→「詳細設定」タブ→「環境変数(N)」)。ここでの説明は C:\home をホームディレクトリと仮定して説明する。Cygwin シェルでは $HOME~/ でホームディレクトリのパス参照が可能である。

  2. Meadow-3.01-dev の導入

    Meadow-3.01-dev についても,日本語 Netinstall: setup-ja.exe を入手して,インストールしておく。インタフェースは Cygwin とほぼ同じで,操作はしごく簡単である。同様に,Emacs 外部パッケージを選択インストールができる。apel(10.7-1)mule-fonts 多言語 BDF フォント(1.0-4)を必ず選択して導入しておく。

    ここでは Meadow は C:\meadow 以下にインストールされたものと仮定する。また Meadow の初期設定ファイル .emacs$HOME ディレクトリに格納されたものとする。

    Emacs 外部パッケージ一覧において ispell パッケージを選択する必要はない。もし選択する場合は,ispell パッケージの auto-autoloads.el と,本稿の .emacs 設定とが競合する問題があるため,前者をロードしないような操作を施す必要がある(後述)。

    Emacs 外部パッケージをあまりに欲張って選択・インストールすると,各パッケージの自動設定プログラム auto-autoloads.el が相互に競合を起こして,.emacs 初期設定処理中にエラーが発生し,うまく動かなかったりすることがある。このため,まずは必要最小限のパッケージで所期の目的を確認しつつ安定動作させたのち,追加して行くことをお勧めする。もし,初期処理中にエラーが発生したら,*Messages* バッファに出力されたメッセージを確認し,エラーの原因となったパッケージ auto-autoloads.el の存在するフォルダ(C:\meadow\packages\pkginfo の下にある)を別の場所に移動させると,問題を回避できることがある。このようにしたとしても,.emacs 設定をしかるべく記述すればパッケージを利用することができる。

  3. Meadow 言語環境の設定

    本稿での Aspell 設定は Unicode 環境を想定したものである。Meadow の言語環境も Unicode に最適化された設定にしておくこととする。以下の内容を .emacs に追加する。

    (set-language-environment "Japanese")
    (set-default-coding-systems 'utf-8-dos)
    (set-buffer-file-coding-system 'utf-8-dos)
    (set-selection-coding-system 'utf-16le-dos)
    (prefer-coding-system 'utf-8)

    set-selection-coding-system 関数の設定は IE 等の他の Windows アプリケーションとの間でテキストをコピー・ペースト(Emacs 用語でいえば,キル・ヤンク)するために必要である(UTF-16 Little Endian を指定している)。この記述がないと,ASCII 以外のあらゆる文字列のコピー・ペーストが文字化けを来す。こんな設定はデフォルトにすべきもののように思われるが,現在の開発版 Meadow 3.01-dev では明示的に記述する必要がある。

    その他,Meadow-3 の多言語環境一般の設定(BDF フォント,インプットメソッド等)については,弊サイト記事『Windows Meadow 3.00』を参考にしてほしい。

  4. 辞書のダウンロード・解凍

    GNU Aspell ホームページ http://aspell.net/ にある辞書アーカイブへのリンクから,以下の辞書アーカイブをダウンロードする。

    ダウンロードしたら,Cygwin シェルの ~/tmp(Windows パスは C:\home\tmp)下に解凍しておく。tar.bz2 アーカイブを処理できるアーカイバ(lhaplus 等)が必要である。Cygwin シェルでダウンロード,解凍するなら,次のようにすればよい。ロシア語辞書の例であるが,これを英,仏,独についても繰返し行う。

    $ mkdir -p ~/tmp
    $ cd ~/tmp
    $ wget -nH -nd \
    ftp://ftp.gnu.org/gnu/aspell/dict/ru/aspell6-ru-0.99f7-1.tar.bz2
    $ tar jxvf aspell6-ru-0.99f7-1.tar.bz2
  5. 辞書の組込み

    Aspell 辞書のインストールは Cygwin のシェルで実施する。以下のロシア語辞書のオペレーションを英・仏・独語用辞書についても同様に行う。いずれも,各言語用辞書の解凍ディレクトリにおいて,./configure,make,make install を順次実行するだけである。

    $ cd ~/tmp/aspell6-ru-0.99f7-1/
    $ ./configure
    $ make
    $ make install
  6. ispell auto-autoloads.el の移動

    Meadow Netinstall で ispell パッケージを選択してインストールすると,ispell 用の自動設定 elisp: auto-autoloads.elC:\meadow\packages\pkginfo\ispell フォルダ下に組込まれ,Meadow が起動するたびに自動的にロードされる。この auto-autoloads.el は,本稿の Aspell 用 .emacs 設定(後述)を反古にしてしまう。このため,ispell 設定用の auto-autoloads.el がロードされないよう,pkginfo フォルダから ispell フォルダを別の場所に移動させておく

  7. Aspell 用 .emacs の調整

    Aspell スペルチェックの設定 elisp を 初期設定ファイル .emacs に追加する。すなわち,以下のテキストをコピーして,.emacs にペーストすればよい。ただし,このテキストには,露・独・仏語の文字が含まれるため,ペーストして格納する前に,必ず C-x RET f utf-8 RET としてバッファ・コーディングシステムを UTF-8 に設定しておく。.emacs に エンコーディング指示を書き込んでいる場合は,これも utf-8 に書き換えておく。.emacs を修正・格納したら,Meadow を再起動すれば,定義が有効になる。

    ;;
    ;;  Aspell -- spell-checking UTF-8 text -- .emacs に追加する elisp
    ;;    based on "Настройка проверки правописания Ispell" by KOSTAFEY
    ;;    (see http://kostafey.blogspot.com/2009/07/emacs-aspell.html)
    ;;
    ;;  注意: .emacs を UTF-8 エンコーディングとすること。 
    ;;  - C-x RET f utf-8 RET で .emacs バッファを UTF-8 にする。
    ;;  - .emacs 先頭に -*- mode: emacs-lisp; coding: utf-8; -*- を記述しておく。
    ;;
    (require 'flyspell)
    (require 'ispell)
    (setq
     ispell-program-name "c:/cygwin/bin/aspell.exe" ;; ユーザー環境に依存
     ispell-dictionary-alist 
     '(
       ;;【ispell-dictionary-alist 指定パラメータ概略】
       ;; 1. Dictionary name: 辞書名
       ;; 2. Case characters (regex): 対象文字セット(正規表現)
       ;; 3. Non case characters (regex): 非対象文字セット(正規表現)
       ;; 4. Other characters (regex): 単語構成特殊文字(正規表現)
       ;; 5. Many other characters (bool): 単語構成特殊文字複合有無(t or nil)
       ;; 6. ispell Arg (list): Aspell コマンド引数リスト("A" "B" "C") → "aspell A B C"
       ;; 7. Extended character mode (const ~tex, ~nroff, etc. or nil): チェックモード
       ;; 8. Coding System: コーディングシステム
       ("English"                       ; English
        "[a-zA-Z]" 
        "[^a-zA-Z]" 
        "[']" nil ("-d" "en") nil iso-8859-1)
       ("Russian"                       ; Russian
        "[АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя]"
        "[^АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя]"
        "[-]" nil ("-d" "ru-yeyo") nil utf-8)
       ("German"                        ; German
        "[a-zA-ZäöüÄÖÜß]"
        "[^a-zA-ZäöüÄÖÜß]"
        "[']" t ("-d" "de_DE") nil utf-8)
       ("French"                        ; French
        "[a-zA-ZçàâéèêëîïôûüÇÀÂÉÈÊËÎÏÔÛÜ]"
        "[^a-zA-ZçàâéèêëîïôûüÇÀÂÉÈÊËÎÏÔÛÜ]"
        "[']" t ("-d" "fr_FR") nil utf-8)
       (nil                             ; Default
        "[A-Za-z]"
        "[^A-Za-z]"
        "[']" nil ("-C") nil iso-8859-1)
       )
     ;; ロシア語を標準とする
     flyspell-default-dictionary "Russian"
     ispell-dictionary "Russian"
     ispell-local-dictionary "Russian"
     ;; Aspell に渡す付加オプション: 高速モード,UTF-8 インタフェース
     ;; see Aspell Manual: http://aspell.net/man-html/index.html
     ispell-extra-args '("--sug-mode=ultra" "--encoding=UTF-8")
    )
    ;;; 不正単語ハイライト表示フェース(デフォルト)
    (setq ispell-highlight-face 'flyspell-incorrect)
    ;;; Text-mode で flyspell を自動起動
    (add-hook 'text-mode-hook 'flyspell-mode)
    ;;; check 前のウェイト秒数
    (setq flyspell-delay 1)
    ;;; 各国語用切替関数の定義
    ;;; Russian, English, French, German in ispell-dictionary-alist
    ;;;; Flyspel
    ;;;; ロシア語
    (defun flyspell-russian ()
      (interactive)
      (flyspell-mode t)
      (ispell-change-dictionary "Russian")
      (flyspell-buffer)
      (message "Russian dictionary - Spell Checking completed."))
    ;;;; 英語
    (defun flyspell-english ()
      (interactive)
      (flyspell-mode t)
      (ispell-change-dictionary "English")
      (flyspell-buffer)
      (message "English dictionary - Spell Checking completed."))
    ;;;; 仏語
    (defun flyspell-french ()
      (interactive)
      (flyspell-mode t)
      (ispell-change-dictionary "French")
      (flyspell-buffer)
      (message "French dictionary - Spell Checking completed."))
    ;;;; 独語
    (defun flyspell-german ()
      (interactive)
      (flyspell-mode t)
      (ispell-change-dictionary "German")
      (flyspell-buffer)
      (message "German dictionary - Spell Checking completed."))
    ;;;; Ispell-buffer
    ;;;; ロシア語
    (defun ispell-russian ()
     "Russian aspell for UTF-8"
     (interactive)
     (ispell-change-dictionary "Russian")
     (ispell-buffer))
    ;;;; 英語
    (defun ispell-english ()
     "English aspell for UTF-8"
     (interactive)
     (ispell-change-dictionary "English")
     (ispell-buffer))
    ;;;; 仏語
    (defun ispell-french ()
     "French aspell for UTF-8"
     (interactive)
     (ispell-change-dictionary "French")
     (ispell-buffer))
    ;;;; 独語
    (defun ispell-german ()
     "German aspell for UTF-8"
     (interactive)
     (ispell-change-dictionary "German")
     (ispell-buffer))
    ;; ファンクションキー
    (global-set-key [(control f1)] 'ispell-word)
    (global-set-key [(control f2)] 'ispell-region)
    (global-set-key [(control f3)] 'ispell-buffer)

    Cygwin,Aspell を本稿の前提パス C:\cygwin 配下とは違う場所にインストールしている場合,ispell-program-name のパス指定を修正しなければならない。上記 elisp が目的とする機能は以下のとおりである。

    • Aspell 露・英・仏・独辞書名をそれぞれ,RussianEnglishFrenchGerman として定義する。先頭は大文字にしてある。
    • スペルチェック対象の各国語エンコーディングを UTF-8 とする。
    • Text mode で flyspell-mode を自動的に起動する(text-mode-hook)。flyspell はカーソル位置の単語に,もしくは単語入力のつど,誤りがあれば,赤く強調表示をする(正確には,オレンジレッド,ボールド,下線付き。これは flyspell-incorrect フェースに定義されている)。辞書に適合している単語は通常の表示である。ここで Text mode とは,通常の .txt プレーンテキストのみならず HTML, LaTeX などをも対象としたテキスト形式編集モード(html-mode,LaTeX-mode 等)のことを指している。
    • 標準辞書はロシア語としている。他の言語辞書に切替えるには,M-x ispell-change-dictionary RET French(切替えたい辞書名) RET とする。以下の flyspell-言語名 もしくは ispell-言語名 のユーザー関数を使うと,その過程で辞書が切替わる。
    • M-x flyspell-russian RET によって露語辞書に切替え flyspell チェックを行う。
    • M-x flyspell-english RET によって英語辞書に切替え flyspell チェックを行う。
    • M-x flyspell-french RET によって仏語辞書に切替え flyspell チェックを行う。
    • M-x flyspell-german RET によって独語辞書に切替え flyspell チェックを行う。
    • M-x ispell-russian RET によって露語辞書に切替え ispell-buffer チェックを行う。
    • M-x ispell-english RET によって英語辞書に切替え ispell-buffer チェックを行う。
    • M-x ispell-french RET によって仏語辞書に切替え ispell-buffer チェックを行う。
    • M-x ispell-german RET によって独語辞書に切替え ispell-buffer チェックを行う。
    • C-f1 によって,現在選択されている辞書で ispell-word を実行する。ispell-word 関数はカーソル位置の単語をチェックし,誤りがあれば別バッファに候補を表示する。
    • C-f2 によって,現在選択されている辞書で ispell-region を実行する。ispell-region 関数はテキスト・リージョン(選択範囲テキスト)に対してスペルチェックを実行し,ミススペルの語を強調表示するとともに別バッファに訂正候補を表示し,ユーザー応答を促す処理を繰り返す。
    • C-f3 によって,現在選択されている辞書で ispell-buffer を実行する。ispell-buffer 関数は編集バッファ全体に対してチェックを行う。

    各国語辞書はそれぞれの言語の方言・正書法に応じて複数用意されている。それは Aspell コマンド引数リスト,例えば,ロシア語辞書定義の ("-d" "ru-yeyo") のうちの "ru-yeyo" の部分に指定することができる。-d は Aspell の辞書を指定する引数であり,それに引き続いて辞書名を指定するわけである。このロシア語用定義で指定されている ru-yeyo は,е(イェ)と ё(イョ)のいずれの表記にも対応できる辞書である。つまり твердый でも,твёрдый でもチェックできる指定である。仮に,ru-ye を指定すると,твёрдый が綴り誤りとしてチェックアウトされる。この方法で指定できる辞書のオプションは,各国語辞書パッケージに添付されている README に説明がある。必ずこれを読んで,ユーザー自身の目的に応じた辞書を("-d" "辞書名") に指定してほしい。

    デフォルト選択辞書をロシア語にしている。別の言語を設定したいのならば,上記 elisp 中の変数 flyspell-default-dictionaryispell-dictionaryispell-local-dictionary の各オペランドを "Russian" ではなく "German" 等の辞書名に書き換えればよい。

    この Aspell 用 elisp 設定は,Windows Meadow のみならず,FreeBSD,Linux,Mac OS X の Emacs でも有効である。もちろん,ispell-program-name のパス指定を使用環境に応じて書き換える必要がある。

  8. 非アクティブ・モード行表示不正対策

    Meadow 標準設定では,非アクティブのモード行(バッファの下にあるステータス表示行)のキリル文字が文字化け(いわゆる「豆腐」)で表示されてしまう。これは Meadow において modeline-inactive 属性のフェース・フォントが,キリル文字を含まないデフォルト・フォントに設定されているためである。この対策として set-face-font 関数によって modeline-inactive 属性に用いるフォントセットを mule-fonts16 に再設定すればよい。M-x set-face-font RET modeline-inactive RET mule-fonts16 RET を実行するとよい。いちいちこれを入力するのが面倒であれば,mule-fonts パッケージ C:\meadow\packages\pkginfo\mule-fonts\auto-autoloads.el を Meadow で開いて,最後尾に以下を追加して格納し,Meadow を再起動すればよい。対策前後を図 1 に示す。

    (set-face-font 'modeline-inactive "mule-fonts16")

    なお,この定義は .emacs に記述できない。フォントセット mule-fonts16 は .emacs よりあとで読込まれる mule-fonts\auto-autoloads.el で定義されているからである。

    m-04-modline-zengo.png
    図 1. 非アクティブ・モード行キリル文字問題対策


Meadow 3.01-dev における GNU Aspell 露・英・仏・独辞書環境設定は以上のとおりである。図 2 に,ispell-buffer によってロシア語テキストをスペルチェックするスクリーンショットを示す。

m-08-ru-buffer.png
図 2. ispell-buffer ロシア語スペルチェック

今回,露・英・仏・独四カ国語を切替える設定を示したけれども,ユーザーにとって不要な言語を削る設定はそれほど難しくないと思う。C-f1 などのショートハンドについても,global-set-key 関数によって,好みのキーに割り当ててもらいたい。

ここで対象にしなかった言語についても,Aspell でサポートされている言語ならば,辞書追加を同じように実施し,上記 elisp の ispell-dictionary-alist に辞書エントリを追加すればよい。エントリの 8 つのパラメータについて上記 elisp 中にもコメントとして概略仕様を簡単にしるしておいたので参考にしてほしい。また,標準 ispell 辞書用の定義が ispell.el にあるので,これを参考に Aspell 用を定義してもよい。詳しくは開発者によるマニュアルを参照のこと(M-x describe-variable RET ispell-dictionary-alist RET から参照できる)。

複数の言語が混在した文書のスペルチェックは当然ながら辞書を切替えながら実施することになる。仏語辞書が選択されているとき独語テキスト部分で誤りと判断される単語が大量に出てしまうのは致し方ない(図 3. フランス語辞書選択時と,図 4. ドイツ語辞書選択時の画面を比較せよ)。ロシア語辞書の場合は,ispell-dictionary-alist 定義によって,キリル文字のみが対象文字セットに指定されているため,ASCII 文字からなる単語には反応しない。

m-10-flys-fr.png
図 3. フランス語辞書使用時
m-11-flys-de.png
図 4. ドイツ語辞書使用時