<!doctype linuxdoc system>

<article>

<title>E_dictionary-mini-HOWTO -コンピュータで英和&amp;和英辞典を使う-
<author>西本孝志(g96p0935@mse.waseda.ac.jp)
<date>平成１０年１月１０日(土) 執筆始め
<!-- ########################### NEW SECTION ############################# -->
<sect>はじめに
<p>
<!-- +++++++++++++++++++++++++++ NEW SUBSECTION ++++++++++++++++++++++++++ -->
<sect1>この mini-HOWTO について
<p>
UNIX の文書やマニュアルは、大抵英語です。UNIXを使いこなすためには、英文であ
れなんであれマニュアルを、読みこなさなければなりません。我々日本人にとって、英語のマニュ
アルは、漢字の問題(2バイト文字であることと漢字コード)とともに大きな関門とな
ります。UNIXに限らず、英語は世界標準言語ですから、嫌が応でも付き合っていかな
くてはなりません。

この mini-HOWTOは、英文読解を助けるため、コンピュータで英和辞典を使ってしま
おうという目的で書かれました。コンピュータの横に英和辞書を置いている人、今日からそん
なことしなくても良いのです。辞書引きなど、所詮は英語から対応する日本語を探
すだけなのだから、コンピュータにやらせればよいのです。

幸いなことに、インターネット上には、フリーな辞書データが豊富にあります。
また、UNIXは、テキスト処理を大得意としていますから、UNIXのおもしろさにふれること
にもなるでしょう。

僕は、Linuxしか持っていませんが、Free-BSDなど他のUNIX系OSでも使えると思いま
す。だからこれらを総称してUNIXと表記してあります。
<!-- +++++++++++++++++++++++++++ NEW SUBSECTION ++++++++++++++++++++++++++ -->
<sect1>必要なもの
<p>
<descrip>
<tag>Perl 5(大抵のUNIXディストリビューションに付いている筈)</tag>テキス
        ト処理を始め、日常出てくるあらゆる問題をいとも簡単に解決してしま
        う超便利な言語。インタプリタなのでコンパイルせずに走るし、その割
        に動作が速い。CとともにUNIXの標準言語の地位を築きつつあります。
        学ぶ価値大！

<tag>nkf (日本語環境を構築したらある筈)</tag>
	日本語の漢字コードは、「日本語EUC(主にUNIXで使われている)」、
	「MS漢字(別名 「shift-JIS」。その名の通り、MS-DOS や Windows で使わ
	れている)」、「JIS(internet mailで使われている)」の3種類あります。
	これらの漢字コードの相互変換を行う、日本人必携のツールです。Debian
	LinuxならJPパッケージの non-free セクションにあります。
        他のLinuxなら、PJEパッケージに入っています。

<tag>look (普通にUNIXをインストールしたらある筈)</tag>
	テキストを binary search するコマンド。binary search は、ソートされ
	ているテキストを高速に検索するアルゴリズムです。

</descrip>
これらがインストールされていることは、
<verb>
which perl
which nkf
which look
</verb>
で確認できます。
perlのバージョンは、
perl -v
で確認できます。version 5. という文字が現われていれば ok です。
<!-- +++++++++++++++++++++++++++ NEW SUBSECTION ++++++++++++++++++++++++++ -->
<sect1>免責
<p>
筆者は、このドキュメントを参考とした、あなたの行為によってあなたのPC、ディ
スク、メモリ、MOなどが損害を受けた場合でも、一切その責任を負いません。す
べてご自分のリスクでやってください。まあ、危ない処理は全然やっていません
ので、そういう危険性は皆無に近いですが。
<!-- ########################### NEW SECTION ############################# -->
<sect>準備
<p>
<!-- +++++++++++++++++++++++++++ NEW SUBSECTION ++++++++++++++++++++++++++ -->
<sect1>辞書データを入手
<p>
<verb>
ftp://ring.aist.go.jp/pub/pack/data/writing/dic/translat/
http://www-nagao.kuee.kyoto-u.ac.jp/member/tsuchiya/sdic
</verb>
には gene95という辞書が置いてあります。
収録語数 55000 語、用例付きと十分実用レベルに達しています。

また、niftyserve に加入しているならば、FENG に「英辞郎」という gene95 
とは比べものにならないほど大きな辞書があります。現在筆者は英辞郎を使っ
ています。

$ cd /tmp

/tmpにダウンロードした辞書を展開します。 拡張子が .lzh なので、
<verb>
lha x filename
</verb>
で展開できます。
以後、使う辞書は gene95 あるいは英辞郎であることを前提にします。
<!-- +++++++++++++++++++++++++++ NEW SUBSECTION ++++++++++++++++++++++++++ -->
<sect1>辞書データの加工
<p>
入手したばかりの辞書は、大抵Shift-JIS コードで、改行が CR+LF となっています。
gene辞書も英辞郎もそうなっています。
dos & windows ならこれが標準ですが、UNIXで使うためには、変換が必要になりま
す。nkfで漢字コードをEUCコードにします。-eオプションを指定します。半角カ
ナの変換のために、-X も付けます。
改行コードは perl で読み込めば勝手に変換されます。
 > のあとに変換後の辞書データのファイル名が入ります。
ファイル名は ej.dic としておきます。

また、nkfは漢字コードを自動判別してくれるので、事前の漢字コードの確認は必要ありません。

以上をまとめて gene95 なら、
<verb>
    nkf -SXe gene.txt | \
    perl -ne 'chop;chop; $_=" $_\n" if ($.%2 == 0);print;' | \
    perl -pe '$_="■$_";' > ej.dic
</verb>
を、実行します。英辞郎なら、
<verb>
    nkf -SXe *[a-z].txt | \
    perl -pe '$_=substr($_,0,-2) . "\n";' > ej.dic
</verb>
です。
<!-- +++++++++++++++++++++++++++ NEW SUBSECTION ++++++++++++++++++++++++++ -->
<sect1>辞書データのインストール
<p>
変換が終わったら、この辞書をインストールします。次のコマンドを入れてくださ
い。root になって作業しますので、注意してコマンドを入力してください。

<verb>
$ su
# mkdir /usr/local/lib/dictionary
# mv /tmp/ej.dic /usr/local/lib/dictionary
</verb>

<!-- ########################### NEW SECTION ############################# -->
<sect>辞書引きコマンドの作成
<p>
<!-- +++++++++++++++++++++++++++ NEW SUBSECTION ++++++++++++++++++++++++++ -->
<sect1>とりあえず使ってみましょう
<p>
この時点で、lookコマンドで辞書を引くことが可能です。以下のコマンドで、実験
してください。

<verb>
look -f '■dog ' /usr/local/lib/dictionary/ej.dic
</verb>

<code>
■dog 1.犬,2.見にくい人(uglt person)(通常,女性に対して用いる),ブス,3.尾行する
■dog days (the 〜)(夏の)土用,盛夏の時期,暑い日々(the Dog Starが太陽とともに昇る季節)
■dog eat dog 同族の傷つけ合い,仲間争い,共食い,我がちの争い
■dog fall (レスリングの)引き分け
(以下省略)
</code>

英和辞典のデータはコンピュータからしてみれば和英辞典にもなります。単に辞
書データを全文検索してしまえばよいだけです。コンピュータを起動して初めて
アクセスするなら英辞郎で5秒ほど時間がかかるかもしれませんが、2度目以降な
ら一瞬です。キャッシュにたまるからです。それに今のパソコンの本当の能力は
あなたの想像をはるかに絶するものです。

<verb>
grep '電気電子学会' /usr/local/lib/dictionary/ej.dic 
</verb>

<code>
■institute of electrical and electronics engineers : 《米》電気電子学会◆【略】IEEE
</code>

どうですか。これでも十分使えますが、単語を調べる度に look や grep を起動するのはめ
んどくさいですね。インターフェースは次章で作ります。

<!-- +++++++++++++++++++++++++++ NEW SUBSECTION ++++++++++++++++++++++++++ -->
<sect1>dic_look スクリプト
<p>
まずは、英語か日本語(自動判別する)を引数にとって辞書引きをするスクリプトを作ります。
dic_look とです。後々のために、英語の活用語尾解析をする機能も付けてあります。
次のコマンドで、本文の後についているスクリプトを
/usr/local/bin/dic_lookというファイル名で切り出してください。

<verb>
perl -ne 'print if ((/#\!.*perl/ .. /#end dic_look/) );' E_dictionary-mini-HOWTO.sgml > /usr/local/bin/dic_look
</verb>
<!-- +++++++++++++++++++++++++++ NEW SUBSECTION ++++++++++++++++++++++++++ -->
<sect1>確認
<p>
C-shell 系をお使いなら

<verb>
$ rehash
</verb>
と入れて、このスクリプトをパスが通った実行ファイルとして認識させてください。

B-shell 系をお使いならその必要はありません。
そして、

<verb>
$ dic_look looked
</verb>

<code>
■look-ahead 【コンピュータ】予見(の),先取り(の),予知能力(のある)
■look-alike うり二つ,そっくりさん
■look-in (a 〜)1.さっと見ること,一瞥,2.短い訪問,3.《俗語》勝利[成功]の見込み
■look-up ルックアップ
■look 1.目つき,外観,様子,2.にふさわしい様子である,捜す,の目つきをする,のようにみえる,と思われる,注意を向ける,見る,眺める(こと),調べる(こと),の傾向にある / It does not taste as bad as it looks. 見た目ほど味は悪くない
■look ~ in the face の顔をじっと見る
■look about 見回す
(以下省略)
</code>

どうですか。これで、活用語尾も解析してくれましたね。

<!-- ########################### NEW SECTION ############################# -->
<sect>コマンドラインで使う
<p>
英語の教科書や英字新聞を読むときは、ttyベースで何度も単語を聞いてくるインター
フェースが一番です。

<verb>
ftp://ftp.u-aizu.ac.jp/pub/SciEng/nihongo/ftp.cc.monash.edu.au/00INDEX.html
</verb>
には、xjdicというプログラムもありますが、ここでは自分で作ってみましょう。
専用のプログラムに頼らなくても script で同等の機能を簡単に実現できるのは、
UNIXの強みの一つです。

<!-- +++++++++++++++++++++++++++ NEW SUBSECTION ++++++++++++++++++++++++++ -->
<sect1>dictionary スクリプト
<p>
次のコマンドで、スクリプトを/usr/local/bin/dictionaryというファイル名で切り出してください。
dictionary スクリプトでやっていることは、英語か日本語の入力を dic_look スクリプトに渡しているだけです。

<verb>
perl -ne 'print if ((/#\!.*sh/ .. /#end dictionary/) );' E_dictionary-mini-HOWTO.sgml > /usr/local/bin/dictionary
</verb>

<!-- +++++++++++++++++++++++++++ NEW SUBSECTION ++++++++++++++++++++++++++ -->
<sect1>さあ、使ってみましょう
<p>
これで、ttyベースのコマンドができました。調べたい単語を入力すると意味が出て
きます。終了するときは、そのまま改行キーを押してください。

C-shell 系を使っている人は、初めてdictionaryコマンドを実行する前に rehash 
コマンドを実行すること。

<verb>
$ dictionary

dictionary: free
■free-agent 自由契約選手
■free-fall (パラシュートが開く前の)自然落下
■free-for-all 1.だれでも自由に参加出来る競技,2.入場自由の,3.収拾のつかない議論,乱闘
■free-lance 1.(作家,俳優などが)自由契約(寄稿)の,フリーの,フリーランサー,2.自由契約で仕事する,(作家,俳優などが)自由契約(寄稿)の,(動)自由契約で働く
■free-lance diplomat フリーの外交官
■free-spender 金遣いの荒い人,あまり物事を考えずにお金を遣う人
■free-trade zone 自由港(free port),:略:FTZ
■free 〜のない,自由に,ひまな,無料の,解放する,フリーの,暇な,ゆるく
■free Yen account 【経済】自由円預金

dictionary: ball
■ball 球,ボール,《俗語》お楽しみ(性行為を含意する事が多いので注意),根性,大舞踏会,舞踏会,球状のもの,丸める,球にする,球状になる
■ball and chain やっかいな物(encumbrance),《比喩的》女房
■ball cock フロート栓
■ball game 1.球技,野球の試合,2.競争,活動,状況
■ball game +1 (the 〜)重要で決定的な要素(出来事),活動の中心(the main and decisive factor, event, etc.)
■ball park 概算
■ball point (pen) ボールペン
■ball position ポールポジション

dictionary: 落雷
■cloud-to-ground discharge : 落雷｛らくらい｝
■coup de foudre : 一目惚れ｛ひとめぼれ｝、青天｛せいてん｝の霹靂、落雷｛らくらい｝
■death by lightning : 落雷死
■flash to ground : 落雷｛らくらい｝
■ground discharge : 落雷｛らくらい｝
■lightning damage : 落雷による被害
■Lightning Protection Institute : 落雷防護研究所◆【略】LPI
■lightning stoke : 電撃｛でんげき｝、落雷｛らくらい｝
■lightning strike : 電撃｛でんげき｝スト、雷撃｛らいげき｝、落雷｛らくらい｝、抜き打ちスト
■stroke of lightning : 落雷｛らくらい｝
■struck by lightning, be : 雷に撃たれる、落雷する
■thunderbolt  {名} : 《気》落雷
■thunderbolt flash to ground : 落雷｛らくらい｝
■United Lightning Protection Association : 落雷防止協会連合◆【略】ULPA

dictionary: (そのまま改行キーを押すと終了)
</verb>

<!-- ########################### NEW SECTION ############################# -->
<sect>Emacs で使う
<p>
UNIXコマンドとして実用的にするためには、
Emacsとお友達になるのが一番です。Emacsは普通のエディタどころか、何でもでき
る万能選手であることは少し UNIXをいじった人なら周知の事実です。
日本人が英語に悩むのはみんな同じなので、すでに似たような Emacs Lisp が以下の URL にありますが、僕も作ってみましたので、紹介します。

<verb>
    http://www-nagao.kuee.kyoto-u.ac.jp/member/tsuchiya/sdic
</verb>
<!-- +++++++++++++++++++++++++++ NEW SUBSECTION ++++++++++++++++++++++++++ -->
<sect1>dictionary.el
<p>
次のコマンドで、emacs lispをload-path の通ったディレクトリに(たとえば ~/elisp) dictionary.elというファイル名で切り出してください。

<verb>
perl -ne 'print if ((/^ *;begin dictionary.el/ .. /;end dictionary.el/) );' E_dictionary-mini-HOWTO.sgml > ~/elisp/dictionary.el
</verb>

その後、.emacsに
<code>
(load "dictionary")
(define-key global-map "\C-z" 'gene-word)
(define-key global-map "\M-\C-z" 'gene-string)
</code>
と適当なキーに割り当ててください。
コマンド名が gene で始まるのは、ただ筆者が昔 gene 辞書を使っていたからです。
当然 dictionary.el は、英辞郎でも使えます。
Emacsを suspend することはほとんどありえないので、ここでは Ctrl+Z に割当てるものとして話を進めます。

kon を使う人は解像度を 800x600 にしてください。
100桁 x 37行 なので、VGA で kon を使っている人から見るとより画面が広くなった
ように感じます。
800x600 で kon を使うには、
<verb>
&dollar; kon stealth 
</verb>
を試してみてください。筆者の環境ではうまくいきましたが、
うまくいかないこともあるかもしれません。

うまくいかないときは、gene-word 関数の
<code>
  (gene-string (downcase (buffer-substring beg end))))
   ^^^^^^^^^^^
</code>
の部分を gene-string-1 に変えてください。

<!-- +++++++++++++++++++++++++++ NEW SUBSECTION ++++++++++++++++++++++++++ -->
<sect1>さあ、使ってみましょう
<p>
<sect2>基礎の基礎
<p>
man page でも何でもいいから、英文を Emacs のバッファに読みこんでください。
そして、単語の上にカーソルを置いて、C-z を押してください。
すると、画面が2分割して、 *GENE* というバッファに意味が出てくるか、
別なフレームに表示されます。

すでに活用語尾解析をする辞書引き
を作成しましたので、先頭が大文字であろうが、過去形だろうが、現在分詞だろう
が、比較級だろうが、ちゃんと原形を検索してくれるはずです。

また、 M-C-z でプロンプトを表示します。英語(熟語も可)を入れたら英和辞
典として起動しますし、日本語を入れたら和英辞典として起動します。
<sect2> *GENE* バッファでの操作
<p>
 *GENE* というバッファ(最初にスペースがあることに注意)に移ると独特の操作が可能です。

画面が分割されている状態で  *GENE* バッファで &lsqb;RET&rsqb; を押すと、
その行がもう一つのウィンドウ(厳密には 'C-u -1 C-x o' で切替えられるウィンドウ)
のバッファに挿入されます。
英文を読んでいて、単語リストを作りたいときに便利です。

また、  *GENE* バッファの中で英和辞典を起動するときは C-M-z を省略できます。
アルファベット文字 a を押すと、 C-M-z a と押したのと同じ状態になります。
つまり、  *GENE* バッファの中では英単語を入力して &lsqb;RET&rsqb; を押すだけで
英和辞典が引けるのです。
ただ、和英辞典として使うときはちゃんと C-M-z を押さなくてはなりません。

<!-- +++++++++++++++++++++++++++ NEW SUBSECTION ++++++++++++++++++++++++++ -->
<sect1>矢印キーを使って快適に英文を読みたい人へ(ノートパソコン向け)
<p>
筆者のようにノートパソコンを持っているなら、矢印キーの左には Alt キー、
右には Ctrl キーがあることが多いです。英文を読むときは、矢印キーと 
PageUp,PageDown,Space,geneキー(今作ります)があれば事足ります。
ここでは、図のように右手を置いて小指の Ctrl キーで gene-word を起動するように設定します。
<verb>

  +------+------+------+------+------+
  | Alt  |  ←  |  ↓  |  →  | Ctrl |
  +------+------+------+------+------+
	  人差指  中指   薬指   小指

</verb>
右Altキーのキーコードは100で、右Ctrlキーのキーコードは97です。キーコー
ドは showkey コマンドで調べることができます。オプションなしで showkey 
コマンドを起動してみてください。10秒待てば勝手に終了してくれます。
なぜ Q とか q で終了しないのかというと、それでは Q とか q 自身の
キーコードが調べられないからです。

以下の記述を
~/mykeymap.map に保存します。

<code>
keycode  97 = F20
keycode 100 = space
string F20 = "\033[34~"
</code>

tcsh,csh を使っている人は .login に、 bash を使っている人は .bash_profile に
<code>
loadkeys ~/mykeymap.map
</code>
の記述を加えましょう。

そして、.emacs に
<code>
(defun left-x ()
  (interactive)
  (if buffer-read-only (backward-word 1) (backward-char 1)))

(defun right-x ()
  (interactive)
  (if buffer-read-only (forward-word 1) (forward-char 1)))
(define-key global-map [f20] 'gene-word)
(define-key global-map [left] 'left-x)
(define-key global-map [right] 'right-x)
</code>
の記述を加えます。これで、バッファがリードオンリーのときに矢印キーを押
せば、ワード単位にカーソルが移動します。なぜそのように設定したかという
と、リードオンリーのときにはメッセージを読むことが多く、このような場合、1文字単位にカーソルが移動してしまっては、遅すぎてストレスになるからです。

ノートユーザなら今日から英文ドキュメントは右手だけで読みましょう！
<sect1>X ユーザなら英文はマウス一つで読みましょう。
<p>
卓上機で X を使っているなら、マウスも使いたいでしょう。当たり前のことで
すが、マウスはマウスカーソルが画面中を走り回り、コンピュータに「ここをこ
うして」と命令する装置です。その命令を発するのは2つか3つあるボタンです。
また、マウスカーソルが動く速度はキーボードでカーソルを動かす速度よりもずっ
と速いものですから、マウスの右クリックで次のページに進んで、わからない単
語があったらダブルクリックで意味を調べればよいでしょう。意味は別なフレー
ム(Emacs の X レベルのウィンドウ。Emacs はウィンドウという言葉を別の意味
に使います。)に表示されます。それぞれのフレームを重ならないように置けば
よいのです。それにより、

！！キーボードに触らなくてもマウスだけで英文を読めます。！！

この操作性は一度はまったらもうキーボードへ戻れないくらいのものです。なぜ
なら、この操作はマウスを最もマウスらしく使う使い方なのですから。

そのためには .emacs に
<code>
(define-key global-map [down-mouse-1] nil)
(define-key global-map [mouse-3] 'scroll-up)
(define-key global-map [double-mouse-1] 'gene-word)
</code>
の記述を加えます。ドラッグするとき、リージョンが反転表示されなくなりま
すが、マウスでちゃんと copy &amp; yank ができます。

ただ、この操作性を実現するには、かなり広い解像度が必要です。
800x600 程度だと無理があるでしょう。
筆者のようにノートパソコンで最大解像度が 800x600 ならば、 X を使うことはあまり
おすすめできません。ノートパソコンで Windows を使っている人を見ていても、
Word や Excel を最大表示して、トラックボールでぎこちなくマウスカーソルを動か
している姿は見るに耐えません。 window system は、「広い解像度を持つ画面」、
「使い易いマウス」、「速いビデオカード」のうちどれ一つでも欠けていたら、
決して使いやすくはありません。全ての操作をキーボードでやるくらいだったら、
いっそのこと kon を使いましょう。kon こそがあなたの求めているものです。

<!-- ########################### NEW SECTION ############################# -->
<sect>総括
<p>

筆者のLinux(UNIX)歴はたったの4ヶ月(1998年1月現在)です。それでもEmacsと
Perlは大好きです。この文書を読んで、英文マニュアルも怖くなくなった人や
EmacsとPerlがもっと好きになった人が出てくれば筆者としてこれ以上ない喜
びです。

Linux以前はWindows95を使っていました。Windowsでも、英和辞典はありますが、窓
が小さすぎたりするし、Emacsのような万能選手不在のため、あまりいいものはない
と筆者は思います。例えば、英語のヘルプファイルを読むとき、わからない単語が
出るたびにいちいちフォーカスを英和辞典の切り替えて調べなくてはならないので
は、能率が悪すぎます。マウスカーソルを合わせるだけで意味が出てくるような優
れものの存在も知っていますが、Windows98で使えるかどうかは定かではないし、値
段が高いです。諸悪の根源はプログラム間に協調性というものが無いところだと筆
者は考えています。ユーザーが自由に機能拡張することすらできないくせに全て自
分でまかなおうたって、うまくいく筈がないです。

一方、UNIXなら、Emacsという万能選手がいて、HTMLだろうが、groffだろうが、整
形された状態で辞書を引くことができます。しかも、「無料」で使えます。ちょっ
とした機能拡張なら簡単にできます。Windowsの世界なら高価な市販ソフトに頼らな
けらばならない局面でも、プログラム同士が仲良く(shell scriptを見てみればよく
わかる)、何でもできるEmacsがあってこそ、いとも簡単に問題が解決されました。
プログラム間の協調性というものがいかに重要なのかわかるでしょう。

この文書を書くきっかけを与えてくれた、Tagami.Kさん、KURUMIさんに大変感謝し
ています。Tagami.Kさんには、フリーな英和辞典データの存在と活用法を教えてい
ただき、KURUMIさんには、gene95 をUNIXで使うための文書化を許可してくれました。
この2人の助けがなければ、この文書は書けませんでした。

この文書にあるプログラムやスクリプトはバージョンアップしていく予定です。
バージョンアップしたら、なるべく早く文書に反映していくつもりです。

この文書は初めて JF に出すものです。記述内容に間違いなどがあったとき、より良い情報を入手したときには筆者にメールで知らせてくれれば幸いです。
お怒りメールは出しても構いませんが、/dev/null に葬られるでしょう（笑）

<!-- ########################### NEW SECTION ############################# -->
<!-- <sect>独り言 -->
<!-- <p> -->
<!-- 書き始めてからもう1年にもなるのか。 -->
<!-- ########################### NEW SECTION ############################# -->
<sect>改訂履歴
<p>

<descrip>
<tag>平成１０年１月１０日(土)</tag> 執筆始め
<tag>平成１０年１月２８日(水)</tag> elispプログラムの強化、右手で英文を読むための設定の追加
<tag>平成１０年１月２９日(木)</tag> JFにドラフトとして投稿
<tag>平成１０年１２月１６日(水)</tag>英辞郎の記述を加える。プログラム
を改良する。
<tag>平成１１年３月１９日(金)</tag>gene.el を改良。
</descrip>
<!-- ########################### NEW SECTION ############################# -->
<sect>スクリプトなど
<p>
<verb>
#begin dic_look
#!/usr/bin/perl
### dic_look     活用語尾対応辞書検索 script
###  活用語のとき活用語尾から原形を調べる。また、語頭の大文字にも対応。
###  さらに、複数の辞書でも検索できる。結果は sort された状態で表示。
###  look コマンドと置き換えてください。
###  使用方法 : dic_look word
###
###  Ver. 1.0  97/11/28  2時間で完成
###

##辞書ファイルのパスとファイル名
#$dic_path = '/usr/local/lib/dictionary';
#@dic_file = ("$ENV{HOME}/words",'ej.dic');
#@dic_file = ('gene.dic2','term95.dic','papadic5.dic');
$dic_path = '/usr/dict';
@dic_file = ('./eijirou.sdic');

###------------------------------------------------------------------
## main code
#&amp;debug; 
($word=shift) || die "usage: dic_look word\n";
#ここから改良

if($word =~ /^[0-9a-zA-Z]/){
    foreach $dic (@dic_file){
	&amp;look_words($dic,&amp;word_conv($word),&amp;word_conv(&amp;capital($word)));
    }
#    print sort rule @output;
    print  @output;
}else{
    chdir $dic_path;
    system('grep',$word,@dic_file);
}

## sub routines

sub rule{
    ##行頭の英語で sort
    ($aa) = $a =~ /^([a-zA-Z ]+)/;
    ($bb) = $b =~ /^([a-zA-Z ]+)/;
    $aa cmp $bb;
}

sub look ($$){
    ##単語を辞書で検索
    my $dic=shift; my $word=shift;
    ($word eq '') &amp;&amp; return;
    chdir $dic_path;
#    open(LOOK,qq?look -f "■$word" $dic |?);
    open(LOOK,qq?sass "<K>$word&etago;K>" $dic ; sass "<K>$word " $dic   |?);

    while(<LOOK>){
        s/^.+<K>(.+)<\/K>(.+)$/\1 :\2/;
	push (@output,$_);
        # push (@output,$_) if /^■$word\b/i;
    }
    close LOOK;
}

sub look_words ($@){
    ##複数の単語を検索
    my $dic=shift; my @words=@_; 
    foreach (@words){
	&amp;look($dic,$_);
    }
}

sub capital ($){
    ##先頭が大文字なら小文字に変えたものを、そうでなければ '' を返す
    local $_ = shift;
    if (/^[A-Z]/){ 
	tr/A-Z/a-z/;
	return $_;
    }else{
	return '';
    }
}
sub word_conv ($){
    ##活用形から原形として考えられるものすべてと自分自身を返す
    local $_ = shift;
    ($_ eq '') &amp;&amp; return '';

    $a='[a-zA-Z]'; $x='[aiueo]'; $y='[^aiueo]';

    #比較級、最上級
    /^($a+(.))\2e(r|st)$/g &amp;&amp; return ($&amp;,"$1","$1$2");
    /^($a+)ie(r|st)$/g     &amp;&amp; return ($&amp;,"$1y","$1ie");
    /^($a+)e(r|st)$/g      &amp;&amp; return ($&amp;,"$1","$1e");

    #3単現、複数形
    /^($a+)ses$/g   &amp;&amp; return ($&amp;,"$1s","$1se");
    /^($a+)xes$/g   &amp;&amp; return ($&amp;,"$1x","$1xe");
    /^($a+)shes$/g  &amp;&amp; return ($&amp;,"$1sh","$1she");
    /^($a+)ches$/g  &amp;&amp; return ($&amp;,"$1ch","$1che");
    /^($a+)zes$/g   &amp;&amp; return ($&amp;,"$1z","$1ze");
    /^($a+)ies$/g   &amp;&amp; return ($&amp;,"$1y","$1ie");
    #/^($a+$y)ies$/g &amp;&amp; return ($&amp;,"$1y","$1ie");
    #/^($a+$y)oes$/g &amp;&amp; return ($&amp;,"$1o","$1oe");
    /^($a+)oes$/g   &amp;&amp; return ($&amp;,"$1o","$1oe");
    /^($a+)ves$/g   &amp;&amp; return ($&amp;,"$1f","$1fe","$1ve");
    /^($a+)s$/g     &amp;&amp; return ($&amp;,"$1");

    #過去形、過去分詞
    /^($a+)ied$/g     &amp;&amp; return ($&amp;,"$1y","$1ie","$1i");
    #/^($a+$y)ied$/g  &amp;&amp; return ($&amp;,"$1y","$1ie","$1i");
    /^($a+(.))\2ed$/g &amp;&amp; return ($&amp;,"$1","$1$2","$1$2e");
    /^($a+c)ked$/g    &amp;&amp; return ($&amp;,"$1","$1k","$1ke");
    /^($a+)ed$/g      &amp;&amp; return ($&amp;,"$1","$1e");

    #現在分詞
    /^($a+(.))\2ing$/ &amp;&amp; return ($&amp;,"$1","$1$2","$1$2e");
    /^($a+c)king$/    &amp;&amp; return ($&amp;,"$1","$1k","$1ke");
    /^($a+)ying$/     &amp;&amp; return ($&amp;,"$1y","$1ye","$1ie");
    /^($a+)ing$/      &amp;&amp; return ($&amp;,"$1","$1e");

    #副詞の ly
    /^($a+)ly$/      &amp;&amp; return ($&amp;,"$1");

    #もともと原形のとき
    $_;
}

sub debug {
    while(<DATA>){
	chomp;
	print join(',',&amp;word_conv($_)),"\n";
    }
    exit;
}

__END__
#end dic_look
#begin dictionary
#!/bin/sh
while true;
do
	echo -n "dictionary: ";
	read word;
	if test -z "$word"; then exit; fi
	    dic_look "$word"
	echo;
done;
#end dictionary
;begin dictionary.el
(defvar gene-window-height 5
  "*gene*ウィンドウの行数")
(defvar gene-buffer " *GENE*"
  "gene 辞書を表示するバッファ")
(defvar gene-frame-alist
  '((width . 70)                        ;表示桁数
    (height . 30)                       ;表示行数
    (menubar . nil)                  ;ミニバッファなし
    (title . "GENE dictionary")         ;タイトル
    )
  "gene 辞書を表示するフレームのパラメータ(X使用時だけ有効).
好きなように書き換えてください。")

(setq truncate-partial-width-windows nil)

(if (boundp 'MULE)
    (define-program-coding-system
      nil "dic_look" (cons *euc-japan*unix *euc-japan*unix))
  ;; in Emacs20
  (set-language-environment "Japanese")
  (set-terminal-coding-system 'euc-japan)
  (set-default-coding-systems 'euc-japan))

(defvar gene-mode-map nil
  "gene辞書を表示するバッファで使うキーマップ")
(cond ((not gene-mode-map)
       (setq gene-mode-map (make-sparse-keymap))
       (let ((i ?a))
         (while (<= i ?z)
           (define-key gene-mode-map (char-to-string i) 'gene-string-in-gene-buffer)
           (setq i (1+ i))))
       (define-key gene-mode-map "\C-m" 'gene-insert-to-text)))

(defun gene-mode ()
  "gene辞書 メジャーモード"
  (setq major-mode 'gene-mode
        mode-name  "GENE")
  (use-local-map gene-mode-map)
  (run-hooks 'gene-mode-hook))

(defun gene-string-1 (string)
  "英単語を入力し、意味を表示する(インターフェース1)
   適当なキーに割り当ててください。"
  (interactive "sEnglish word: ")
  (let (current-window)
    (setq current-window (selected-window))
    (save-excursion
      (set-buffer (get-buffer-create gene-buffer))
      (if (not (eq major-mode 'gene-mode)) (gene-mode))
      (erase-buffer)
      (call-process "dic_look" nil t nil string )
      (select-window (display-buffer gene-buffer))
      (shrink-window (- (window-height) gene-window-height))
      )
    (select-window current-window)
    )
  )

(defun gene-display-buffer ()
  "gene バッファを表示する"
    (if (and (>= (window-width) 82))
	  (progn
            (split-window-horizontally 80)
            (other-window 1)
            (switch-to-buffer gene-buffer)
            (other-window -1)
            (display-buffer gene-buffer)
            )))

(defun gene-string (string)
  "英単語(日本語)を入力し、意味を表示する(インターフェース2)
   日本語を入力したときには、grepをかける。
   適当なキーに割り当ててください。"
  (interactive "sEnglish(Japanese) word: ")
  (let (current-window)
    (setq current-window (selected-window))
    (save-excursion
      (set-buffer (get-buffer-create gene-buffer))
      (if (not (eq major-mode 'gene-mode)) (gene-mode))
      (erase-buffer)
      (call-process "dic_look" nil t nil string )
      (goto-char (point-min))
      (if (not (get-buffer-window " *GENE*" t)) (gene-display-buffer))
;      (set-buffer (get-buffer gene-buffer))
      )
    )
  )

(defun gene-insert-to-text ()
  "辞書の内容1行をもう一方のウィンドウのバッファに書き出す"
  (interactive)
  (beginning-of-line)
  (let* ((beg (point))
	(end (progn (next-line 1) (point)))
	(str (buffer-substring-no-properties beg end)))
    (other-window -1)
    (insert str)))

(defun gene-word (ARG)
  "ポイントの前の英単語の意味を表示する。適当なキーに割り当ててください"
  (interactive "p")
  (if (null ARG) 1)
  (save-excursion
    (if (not (looking-at "\\<"))
	(forward-word -1))
    (setq beg (point))
    (forward-word ARG)
    (setq end (point)))
  (gene-string (downcase (buffer-substring-no-properties beg end))))

(defun gene-word2 ()
  "Print Japanese meaning of word at or before point."
  (interactive)
  (save-excursion
    (setq end (point))
    (if (not (looking-at "\\<"))
	(forward-word -1))
    (setq beg (point))
  (gene-string (downcase (buffer-substring beg end)))))

;; utility function
(defun gene-string-in-gene-buffer ()
  "gene-mode では、アルファベット文字を入力したとたんに gene-string が起動される。"
  (interactive)
  (gene-string (read-string "English word: " (this-command-keys))))

;end dictionary.el
</verb>
</article>
