Archive

Emacsからsdicとsaryを使用して英辞郎を高速検索

Emacs(Meadow)には辞書引きマクロがいくつかあり、私が愛用しているのは軽 くてシンプルなsdicです。 これを使用すると例えばw3m で英文のページを見ながら、キー一つで単語 を和訳することができて非常に便利です。

ところが最近、「英辞郎」を本家サイトから購入し MeadowMemoの記事sdic本家のページを 参考にsdicから使用できるようにしたのですが検索がえらく遅くなってしまいました。

何とかならないかと調べてみると、saryというアプリケーションがあってこれを利用したとこ ろ検索スピードがかなり改善されました。その導入方法のまとめをメモ。ついでにWindows用のバイナリも置きました。

なお英辞郎ファイルをsdicファイルに変換する方法についてはmakeコマンドを 使用する例が紹介しているサイトが多いですが私はsdicに含まれるeijirou.perlから 直接変換しました。Linux上で日本語コードはEUC-JPです。

$nkf  -SXe eijiro97.txt | perl eijirou.perl > eijiro97.sdic

-- 和英の場合 --
$nkf  -SXe waeiji97.txt | perl eijirou.perl --waei > waeiji97.sdic

sdicでsaryコマンドを使用するためのメモ

基本的にLinux/Unixから使用すること想定していますが、 Windows用もがんばれば何とかなるかもしれません。

いつもの文言です。以下の記述については一切責任を持ちませんので御自分の責任でご利用ください。

saryコマンドをインストールする

私の場合Gentoo Linuxを使用していましたので、

#emerge sary

だけで終わってしまいました(というよりは、このためにMY COMジャーナルに紹介されているsufaryではなく saryを導入しています。sufaryはemerge保守されていないようです。)

apt-getでもあるようですので使用できる人はそれとか。ダメな人はソースからconfigure&make&installです。

なお、saryのREADMEやconfigure.inにはコンパイルのためにglibの2.0.0以上 が必要なことが書いてあります。ここらへん はgimp(2.0以上)gnomeを使用し ていれば心配はないのかもしれません。

Windows用はよく分かりませんが、例えばmingw32環境を整え てGimp館の記事などを参考にGTKのサイトから glibのソースをダウンロードして作成すればsary作成の方も何とかなるかもしれません(gimp(2.0以上)を インストールしてglibの必要なファイルを直接手に入れることもできる?)。

Windows用のコマンドを試しにコンパイルしてみました。このページの一番下です。

sdicファイルからaryファイルを生成する

saryのコマンドを使用します。私はLinux上で日本語コードをEUC-JPとしていますので実行はこんな感じでした。

$mksary -c EUC-JP eijiro97.sdic
$mksary -c EUC-JP waeiji97.sdic

長い時間の後、同じディレクトリ内にeijiro97.sdic.aryやwaeiji97.sdic.aryができます。 辞書を引くためにはできあがったaryファイルと元のファイルの両方がディレクトリに 入っていなければなりません。

あとaryファイルはとても巨大です。元のsdicの2〜3倍に膨れ上がりますのでディスクの容量など注意が必要です。

Emacsに設定する

saryをemacsから使用するように調整します。 sdicの基本的なインストール方法はMeadow Memoなどを 参考にしてください。Gentoo Linuxであれば”emerge sdic”を実行します。

しかし、このままだとsdicからsaryを使用できません。COZMIXNGさんでrubyを使用する方法が紹介されていますが、 私はsaryをsdicから直接使用する方法をとりました。fsetで関数を強制置換してしまいます。以下、.emacs用のコードです。

;; ----- sdicを呼び出すための設定(F9で実行)
(global-set-key [f9] 'sdic-describe-word)
(autoload 'sdic-describe-word "sdic" "search word" t nil)
;; ----- sdicが呼ばれたときの設定
(eval-after-load "sdic"
  '(progn
     ;; saryのコマンドをセットする
     (setq sdicf-array-command "/usr/bin/sary")
     ;; sdicファイルのある位置を設定し、arrayコマンドを使用するよう設定(現在のところ英和のみ)
     (setq sdic-eiwa-dictionary-list
           '((sdicf-client "/path/to/eijiro97.sdic" (strategy array))))
     ;; saryを直接使用できるように sdicf.el 内に定義されているarrayコマンド用関数を強制的に置換
     (fset 'sdicf-array-init 'sdicf-common-init)
     (fset 'sdicf-array-quit 'sdicf-common-quit)
     (fset 'sdicf-array-search
           (lambda (sdic pattern &optional case regexp)
             (sdicf-array-init sdic)
             (if regexp
                 (signal 'sdicf-invalid-method '(regexp))
               (save-excursion
                 (set-buffer (sdicf-get-buffer sdic))
                 (delete-region (point-min) (point-max))
                 (apply 'sdicf-call-process
                        sdicf-array-command
                        (sdicf-get-coding-system sdic)
                        nil t nil
                        (if case
                            (list "-i" pattern (sdicf-get-filename sdic))
                          (list pattern (sdicf-get-filename sdic))))
                 (goto-char (point-min))
                 (let (entries)
                   (while (not (eobp)) (sdicf-search-internal))
                   (nreverse entries))))))
     ;; おまけ--辞書バッファ内で移動した時、常にバッファの一行目になるようにする
     (defadvice sdic-forward-item (after sdic-forward-item-always-top activate)
       (recenter 0))
     (defadvice sdic-backward-item (after sdic-backward-item-always-top activate)
       (recenter 0))))

Windows版のおまけ

…とりあえずWindows版でも何とかなるかな、とやってみました。できあがったバイナリをzipで固めて仮置きしておきます。ソースコード等は全て公表されているものを使用しています。

mingw32でコンパイル。作成したコマンドはmkary.exeとsary.exeですがmkary.exeはsaryの ではなくsufaryのものをコンパイルしました。saryのmksary.exeは コンパイルはできたものの実行するとメモリエラーとなりうまくいかなかったです。 というわけでaryファイルを生成する場合にはdos窓で

mksary.exe  eijiro97.sdic

とすれば良いと思います。euc-jpのもので環境もWin2k 256MBでしか試してい ません。Meadowな人はもし良ければダウンロードして試してみてください。と りあえず上の環境で英辞郎ファイル(バージョン97)を使用して、sdicファイル からaryファイルの生成、sary.exeコマンドの直接実行による検索はうまくい きました。