E_dictionary-mini-HOWTO -コンピュータで英和&和英辞典を使う- 西本孝志(g96p0935@mse.waseda.ac.jp) 平成10年1月10日(土) 執筆始め 1. はじめに 1.1. この mini-HOWTO について UNIX の文書やマニュアルは、大抵英語です。UNIXを使いこなすためには、英 文であれなんであれマニュアルを、読みこなさなければなりません。我々日本 人にとって、英語のマニュアルは、漢字の問題(2バイト文字であることと漢字 コード)とともに大きな関門となります。UNIXに限らず、英語は世界標準言語 ですから、嫌が応でも付き合っていかなくてはなりません。 この mini-HOWTOは、英文読解を助けるため、コンピュータで英和辞典を使っ てしまおうという目的で書かれました。コンピュータの横に英和辞書を置いて いる人、今日からそんなことしなくても良いのです。辞書引きなど、所詮は英 語から対応する日本語を探すだけなのだから、コンピュータにやらせればよい のです。 幸いなことに、インターネット上には、フリーな辞書データが豊富にありま す。また、UNIXは、テキスト処理を大得意としていますから、UNIXのおもしろ さにふれることにもなるでしょう。 僕は、Linuxしか持っていませんが、Free-BSDなど他のUNIX系OSでも使えると 思います。だからこれらを総称してUNIXと表記してあります。 1.2. 必要なもの Perl 5(大抵のUNIXディストリビューションに付いている筈) テキスト処理を始め、日常出てくるあらゆる問題をいとも簡単に解決し てしまう超便利な言語。インタプリタなのでコンパイルせずに走るし、 その割に動作が速い。CとともにUNIXの標準言語の地位を築きつつあり ます。学ぶ価値大! nkf (日本語環境を構築したらある筈) 日本語の漢字コードは、「日本語EUC(主にUNIXで使われている)」、 「MS漢字(別名 「shift-JIS」。その名の通り、MS-DOS や Windows で 使われている)」、「JIS(internet mailで使われている)」の3種類あり ます。これらの漢字コードの相互変換を行う、日本人必携のツールで す。Debian LinuxならJPパッケージの non-free セクションにありま す。他のLinuxなら、PJEパッケージに入っています。 look (普通にUNIXをインストールしたらある筈) テキストを binary search するコマンド。binary search は、ソート されているテキストを高速に検索するアルゴリズムです。 これらがインストールされていることは、 which perl which nkf which look で確認できます。 perlのバージョンは、 perl -v で確認できます。version 5. という文字が現われていれば ok です。 1.3. 免責 筆者は、このドキュメントを参考とした、あなたの行為によってあなたのPC、 ディスク、メモリ、MOなどが損害を受けた場合でも、一切その責任を負いませ ん。すべてご自分のリスクでやってください。まあ、危ない処理は全然やって いませんので、そういう危険性は皆無に近いですが。 2. 準備 2.1. 辞書データを入手 ftp://ring.aist.go.jp/pub/pack/data/writing/dic/translat/ http://www-nagao.kuee.kyoto-u.ac.jp/member/tsuchiya/sdic には gene95という辞書が置いてあります。収録語数 55000 語、用例付きと十 分実用レベルに達しています。 また、niftyserve に加入しているならば、FENG に「英辞郎」という gene95 とは比べものにならないほど大きな辞書があります。現在筆者は英辞郎を使っ ています。 $ cd /tmp /tmpにダウンロードした辞書を展開します。 拡張子が .lzh なので、 lha x filename で展開できます。以後、使う辞書は gene95 あるいは英辞郎であることを前提 にします。 2.2. 辞書データの加工 入手したばかりの辞書は、大抵Shift-JIS コードで、改行が CR+LF となって います。 gene辞書も英辞郎もそうなっています。 dos & windows ならこれが 標準ですが、UNIXで使うためには、変換が必要になります。nkfで漢字コード をEUCコードにします。-eオプションを指定します。半角カナの変換のため に、-X も付けます。改行コードは perl で読み込めば勝手に変換されます。 > のあとに変換後の辞書データのファイル名が入ります。ファイル名は ej.dic としておきます。 また、nkfは漢字コードを自動判別してくれるので、事前の漢字コードの確認 は必要ありません。 以上をまとめて gene95 なら、 nkf -SXe gene.txt | \ perl -ne 'chop;chop; $_=" $_\n" if ($.%2 == 0);print;' | \ perl -pe '$_="■$_";' > ej.dic を、実行します。英辞郎なら、 nkf -SXe *[a-z].txt | \ perl -pe '$_=substr($_,0,-2) . "\n";' > ej.dic です。 2.3. 辞書データのインストール 変換が終わったら、この辞書をインストールします。次のコマンドを入れてく ださい。root になって作業しますので、注意してコマンドを入力してくださ い。 $ su # mkdir /usr/local/lib/dictionary # mv /tmp/ej.dic /usr/local/lib/dictionary 3. 辞書引きコマンドの作成 3.1. とりあえず使ってみましょう この時点で、lookコマンドで辞書を引くことが可能です。以下のコマンドで、 実験してください。 look -f '■dog ' /usr/local/lib/dictionary/ej.dic ______________________________________________________________________ ■dog 1.犬,2.見にくい人(uglt person)(通常,女性に対して用いる),ブス,3.尾行する ■dog days (the 〜)(夏の)土用,盛夏の時期,暑い日々(the Dog Starが太陽とともに昇る季節) ■dog eat dog 同族の傷つけ合い,仲間争い,共食い,我がちの争い ■dog fall (レスリングの)引き分け (以下省略) ______________________________________________________________________ 英和辞典のデータはコンピュータからしてみれば和英辞典にもなります。単に 辞書データを全文検索してしまえばよいだけです。コンピュータを起動して初 めてアクセスするなら英辞郎で5秒ほど時間がかかるかもしれませんが、2度目 以降なら一瞬です。キャッシュにたまるからです。それに今のパソコンの本当 の能力はあなたの想像をはるかに絶するものです。 grep '電気電子学会' /usr/local/lib/dictionary/ej.dic ______________________________________________________________________ ■institute of electrical and electronics engineers : 《米》電気電子学会◆【略】IEEE ______________________________________________________________________ どうですか。これでも十分使えますが、単語を調べる度に look や grep を起 動するのはめんどくさいですね。インターフェースは次章で作ります。 3.2. dic_look スクリプト まずは、英語か日本語(自動判別する)を引数にとって辞書引きをするスクリプ トを作ります。 dic_look とです。後々のために、英語の活用語尾解析をする 機能も付けてあります。次のコマンドで、本文の後についているスクリプトを /usr/local/bin/dic_lookというファイル名で切り出してください。 perl -ne 'print if ((/#\!.*perl/ .. /#end dic_look/) );' E_dictionary-mini-HOWTO.sgml > /usr/local/bin/dic_look 3.3. 確認 C-shell 系をお使いなら $ rehash と入れて、このスクリプトをパスが通った実行ファイルとして認識させてくだ さい。 B-shell 系をお使いならその必要はありません。そして、 $ dic_look looked ______________________________________________________________________ ■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 見回す (以下省略) ______________________________________________________________________ どうですか。これで、活用語尾も解析してくれましたね。 4. コマンドラインで使う 英語の教科書や英字新聞を読むときは、ttyベースで何度も単語を聞いてくる インターフェースが一番です。 ftp://ftp.u-aizu.ac.jp/pub/SciEng/nihongo/ftp.cc.monash.edu.au/00INDEX.html には、xjdicというプログラムもありますが、ここでは自分で作ってみましょ う。専用のプログラムに頼らなくても script で同等の機能を簡単に実現でき るのは、 UNIXの強みの一つです。 4.1. dictionary スクリプト 次のコマンドで、スクリプトを/usr/local/bin/dictionaryというファイル名 で切り出してください。 dictionary スクリプトでやっていることは、英語か 日本語の入力を dic_look スクリプトに渡しているだけです。 perl -ne 'print if ((/#\!.*sh/ .. /#end dictionary/) );' E_dictionary-mini-HOWTO.sgml > /usr/local/bin/dictionary 4.2. さあ、使ってみましょう これで、ttyベースのコマンドができました。調べたい単語を入力すると意味 が出てきます。終了するときは、そのまま改行キーを押してください。 C-shell 系を使っている人は、初めてdictionaryコマンドを実行する前に rehash コマンドを実行すること。 $ 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: (そのまま改行キーを押すと終了) 5. Emacs で使う UNIXコマンドとして実用的にするためには、 Emacsとお友達になるのが一番で す。Emacsは普通のエディタどころか、何でもできる万能選手であることは少 し UNIXをいじった人なら周知の事実です。日本人が英語に悩むのはみんな同 じなので、すでに似たような Emacs Lisp が以下の URL にありますが、僕も 作ってみましたので、紹介します。 http://www-nagao.kuee.kyoto-u.ac.jp/member/tsuchiya/sdic 5.1. dictionary.el 次のコマンドで、emacs lispをload-path の通ったディレクトリに(たとえば /elisp) dictionary.elというファイル名で切り出してください。 perl -ne 'print if ((/^ *;begin dictionary.el/ .. /;end dictionary.el/) );' E_dictionary-mini-HOWTO.sgml > ~/elisp/dictionary.el その後、.emacsに ______________________________________________________________________ (load "dictionary") (define-key global-map "\C-z" 'gene-word) (define-key global-map "\M-\C-z" 'gene-string) ______________________________________________________________________ と適当なキーに割り当ててください。コマンド名が gene で始まるのは、ただ 筆者が昔 gene 辞書を使っていたからです。当然 dictionary.el は、英辞郎 でも使えます。 Emacsを suspend することはほとんどありえないので、ここ では Ctrl+Z に割当てるものとして話を進めます。 kon を使う人は解像度を 800x600 にしてください。 100桁 x 37行 なの で、VGA で kon を使っている人から見るとより画面が広くなったように感じ ます。 800x600 で kon を使うには、 $ kon stealth を試してみてください。筆者の環境ではうまくいきましたが、うまくいかない こともあるかもしれません。 うまくいかないときは、gene-word 関数の ______________________________________________________________________ (gene-string (downcase (buffer-substring beg end)))) ^^^^^^^^^^^ ______________________________________________________________________ の部分を gene-string-1 に変えてください。 5.2. さあ、使ってみましょう 5.2.1. 基礎の基礎 man page でも何でもいいから、英文を Emacs のバッファに読みこんでくださ い。そして、単語の上にカーソルを置いて、C-z を押してください。すると、 画面が2分割して、 *GENE* というバッファに意味が出てくるか、別なフレー ムに表示されます。 すでに活用語尾解析をする辞書引きを作成しましたので、先頭が大文字であろ うが、過去形だろうが、現在分詞だろうが、比較級だろうが、ちゃんと原形を 検索してくれるはずです。 また、 M-C-z でプロンプトを表示します。英語(熟語も可)を入れたら英和辞 典として起動しますし、日本語を入れたら和英辞典として起動します。 5.2.2. *GENE* バッファでの操作 *GENE* というバッファ(最初にスペースがあることに注意)に移ると独特の操 作が可能です。 画面が分割されている状態で *GENE* バッファで [RET] を押すと、その行が もう一つのウィンドウ(厳密には 'C-u -1 C-x o' で切替えられるウィンドウ) のバッファに挿入されます。英文を読んでいて、単語リストを作りたいときに 便利です。 また、 *GENE* バッファの中で英和辞典を起動するときは C-M-z を省略でき ます。アルファベット文字 a を押すと、 C-M-z a と押したのと同じ状態にな ります。つまり、 *GENE* バッファの中では英単語を入力して [RET] を押す だけで英和辞典が引けるのです。ただ、和英辞典として使うときはちゃんと C-M-z を押さなくてはなりません。 5.3. 矢印キーを使って快適に英文を読みたい人へ(ノートパソコン向け) 筆者のようにノートパソコンを持っているなら、矢印キーの左には Alt キ ー、右には Ctrl キーがあることが多いです。英文を読むときは、矢印キーと PageUp,PageDown,Space,geneキー(今作ります)があれば事足ります。ここで は、図のように右手を置いて小指の Ctrl キーで gene-word を起動するよう に設定します。 +------+------+------+------+------+ | Alt | ← | ↓ | → | Ctrl | +------+------+------+------+------+ 人差指 中指 薬指 小指 右Altキーのキーコードは100で、右Ctrlキーのキーコードは97です。キーコー ドは showkey コマンドで調べることができます。オプションなしで showkey コマンドを起動してみてください。10秒待てば勝手に終了してくれます。なぜ Q とか q で終了しないのかというと、それでは Q とか q 自身のキーコード が調べられないからです。 以下の記述を /mykeymap.map に保存します。 ______________________________________________________________________ keycode 97 = F20 keycode 100 = space string F20 = "\033[34~" ______________________________________________________________________ tcsh,csh を使っている人は .login に、 bash を使っている人は .bash_profile に ______________________________________________________________________ loadkeys ~/mykeymap.map ______________________________________________________________________ の記述を加えましょう。 そして、.emacs に ______________________________________________________________________ (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) ______________________________________________________________________ の記述を加えます。これで、バッファがリードオンリーのときに矢印キーを押 せば、ワード単位にカーソルが移動します。なぜそのように設定したかという と、リードオンリーのときにはメッセージを読むことが多く、このような場 合、1文字単位にカーソルが移動してしまっては、遅すぎてストレスになるか らです。 ノートユーザなら今日から英文ドキュメントは右手だけで読みましょう! 5.4. X ユーザなら英文はマウス一つで読みましょう。 卓上機で X を使っているなら、マウスも使いたいでしょう。当たり前のこと ですが、マウスはマウスカーソルが画面中を走り回り、コンピュータに「ここ をこうして」と命令する装置です。その命令を発するのは2つか3つあるボタン です。また、マウスカーソルが動く速度はキーボードでカーソルを動かす速度 よりもずっと速いものですから、マウスの右クリックで次のページに進んで、 わからない単語があったらダブルクリックで意味を調べればよいでしょう。意 味は別なフレーム(Emacs の X レベルのウィンドウ。Emacs はウィンドウとい う言葉を別の意味に使います。)に表示されます。それぞれのフレームを重な らないように置けばよいのです。それにより、 !!キーボードに触らなくてもマウスだけで英文を読めます。!! この操作性は一度はまったらもうキーボードへ戻れないくらいのものです。な ぜなら、この操作はマウスを最もマウスらしく使う使い方なのですから。 そのためには .emacs に ______________________________________________________________________ (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) ______________________________________________________________________ の記述を加えます。ドラッグするとき、リージョンが反転表示されなくなりま すが、マウスでちゃんと copy & yank ができます。 ただ、この操作性を実現するには、かなり広い解像度が必要です。 800x600 程度だと無理があるでしょう。筆者のようにノートパソコンで最大解像度が 800x600 ならば、 X を使うことはあまりおすすめできません。ノートパソコ ンで Windows を使っている人を見ていても、 Word や Excel を最大表示し て、トラックボールでぎこちなくマウスカーソルを動かしている姿は見るに耐 えません。 window system は、「広い解像度を持つ画面」、「使い易いマウ ス」、「速いビデオカード」のうちどれ一つでも欠けていたら、決して使いや すくはありません。全ての操作をキーボードでやるくらいだったら、いっその こと kon を使いましょう。kon こそがあなたの求めているものです。 6. 総括 筆者の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 に葬られるでしょう(笑) 7. 改訂履歴 平成10年1月10日(土) 執筆始め 平成10年1月28日(水) elispプログラムの強化、右手で英文を読むための設定の追加 平成10年1月29日(木) JFにドラフトとして投稿 平成10年12月16日(水) 英辞郎の記述を加える。プログラムを改良する。 平成11年3月19日(金) gene.el を改良。 8. スクリプトなど #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 #&debug; ($word=shift) || die "usage: dic_look word\n"; #ここから改良 if($word =~ /^[0-9a-zA-Z]/){ foreach $dic (@dic_file){ &look_words($dic,&word_conv($word),&word_conv(&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 '') && return; chdir $dic_path; # open(LOOK,qq?look -f "■$word" $dic |?); open(LOOK,qq?sass "$word" $dic ; sass "$word " $dic |?); while(){ s/^.+(.+)<\/K>(.+)$/\1 :\2/; push (@output,$_); # push (@output,$_) if /^■$word\b/i; } close LOOK; } sub look_words ($@){ ##複数の単語を検索 my $dic=shift; my @words=@_; foreach (@words){ &look($dic,$_); } } sub capital ($){ ##先頭が大文字なら小文字に変えたものを、そうでなければ '' を返す local $_ = shift; if (/^[A-Z]/){ tr/A-Z/a-z/; return $_; }else{ return ''; } } sub word_conv ($){ ##活用形から原形として考えられるものすべてと自分自身を返す local $_ = shift; ($_ eq '') && return ''; $a='[a-zA-Z]'; $x='[aiueo]'; $y='[^aiueo]'; #比較級、最上級 /^($a+(.))\2e(r|st)$/g && return ($&,"$1","$1$2"); /^($a+)ie(r|st)$/g && return ($&,"$1y","$1ie"); /^($a+)e(r|st)$/g && return ($&,"$1","$1e"); #3単現、複数形 /^($a+)ses$/g && return ($&,"$1s","$1se"); /^($a+)xes$/g && return ($&,"$1x","$1xe"); /^($a+)shes$/g && return ($&,"$1sh","$1she"); /^($a+)ches$/g && return ($&,"$1ch","$1che"); /^($a+)zes$/g && return ($&,"$1z","$1ze"); /^($a+)ies$/g && return ($&,"$1y","$1ie"); #/^($a+$y)ies$/g && return ($&,"$1y","$1ie"); #/^($a+$y)oes$/g && return ($&,"$1o","$1oe"); /^($a+)oes$/g && return ($&,"$1o","$1oe"); /^($a+)ves$/g && return ($&,"$1f","$1fe","$1ve"); /^($a+)s$/g && return ($&,"$1"); #過去形、過去分詞 /^($a+)ied$/g && return ($&,"$1y","$1ie","$1i"); #/^($a+$y)ied$/g && return ($&,"$1y","$1ie","$1i"); /^($a+(.))\2ed$/g && return ($&,"$1","$1$2","$1$2e"); /^($a+c)ked$/g && return ($&,"$1","$1k","$1ke"); /^($a+)ed$/g && return ($&,"$1","$1e"); #現在分詞 /^($a+(.))\2ing$/ && return ($&,"$1","$1$2","$1$2e"); /^($a+c)king$/ && return ($&,"$1","$1k","$1ke"); /^($a+)ying$/ && return ($&,"$1y","$1ye","$1ie"); /^($a+)ing$/ && return ($&,"$1","$1e"); #副詞の ly /^($a+)ly$/ && return ($&,"$1"); #もともと原形のとき $_; } sub debug { while(){ chomp; print join(',',&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