Lookup 1.4+media

Lookup 1.4+media

EPWINGに含まれる動画・音声データの再生を可能にしたLookup 1.4の改造版です。 動画データの再生は白井さんから提供頂いたパッチによるものです。 eblookへのパッチと併せて使用して下さい。 細かいバグ修正も入っています。

for your download

lookup-1.4+media-20240317.tar.gz

アーカイブの使い方

インストールは通常のLookupと同様の手順で行って下さい。 ただし、configureスクリプトからの--with-emacsオプションは無効のようなので、指定する場合はbash等のシェル上から

$EMACS=/your/emacs ./configure .....

とするか、make時に

$make EMACS=/your/emacs install

のようにして下さい。 また、eblookにもパッチを当てる必要があります。

追加される機能、従来からの変更

XEmacsおよび古いEmacsサポートの廃止

20210612以降のバージョンではEmacs 24.5以降のみがサポートされます。

stem-english.el同梱の廃止

20210612以降のバージョンではlisp/stem-english.elは同梱されなくなりました。 MELPAにも登録されているlexical-binding版か、SDICに含まれるオリジナルのstem.elを利用する等してください。

bitmap-muleによるsplash画像表示の廃止

古い Emacs に対するサポート終了に伴い、bitmap-muleによるsplash画像の表示はできなくしました。 bitmap-muleによる外字表示はまだ行えるはずですが、undocumented 扱いになっており、廃止予定です。

splash画像のインストール

従来はバイトコンパイルの際にlookup.elcに画像イメージを取り込まれるようになっていました。 しかし、この方法はEmacs 28以降で利用可能になった native compilationへの対応が困難です。 この為、画像ファイルはdata-directory以下にlookupディレクトリを作って別にインストールするようにしました。 ついでに、カラー画像のフォーマットはPNGに変更しています。

ndebエージェントでの音声・動画リンクの生成

パッチをあてたeblookを使う事で音声・動画に対するリンクが生成されます。 対応する音声・動画はEB Libraryに依存しており、EPWINGのWAVE形式の音声とMPEG1形式の動画となります。 (詳細はEB Libraryのドキュメントを参照して下さい。)

た、補助パッケージを使用している場合はarrangeも正しく設定しないといけません。 arrangeの先頭あるいはndeb-arrange-jpeg等のイメージデータのarrangeの直前または直後にndeb-arrange-wavendeb-arrange-mpegを、arrangeの最後にndeb-arrange-snd-autoplayを追加して下さい。

ndeb-binary-programsの拡張

ndeb-binary-programsに、関数名のシンボルを指定する事で外部プログラムの代わりに関数を呼び出す事ができるようになりました。 この際にはプロパティの指定は無視されます。 音声再生用の関数として、play-sound-file関数を使用するndeb-binary-play-sound-fileが用意されています。

また、プロパティに:directが追加されました。 マルチメディアデータは、一般にHONMONファイル等に収録されており、Lookupではデータを抽出し、一時ファイルを作成した後にプログラムの起動・関数の呼出しを行います。 しかし、動画については抽出せずとも元々一つのファイルとして存在しています。 :directnon-nilにすると、動画の再生時には、最初から存在するファイルを引数にしてプログラムの起動を行うようになります。 このファイルには拡張子が付いていないので、動画を再生するプログラムは拡張子に依らず再生が可能である必要があります。

音声・動画リンクの再生

ndeb-binary-programsに、wavempegに対応した記述を追加する事で音声・動画の再生が可能になります。 play-sound-file関数を持つEmacsでは外部プログラムを使用せずに音声再生が可能です。 この機能を利用する場合は、ndeb-binary-programswaveに対応する記述としてndeb-binary-play-sound-fileを指定するか、ndeb-binary-programsを一切指定しないでデフォルト値を使用して下さい。 一例としては~/.lookupに以下のような記述を行います。

(setq ndeb-binary-programs
      '((wave ndeb-binary-play-sound-file)
        (jpeg "gv")))

ndeb-binary-play-sound-fileを使用する場合、音声再生中はEmacs上で他の操作が一切できなくなります。 この為、後述する:snd-autoplayオプションを有効にすると、音声再生が終了するまでcontentが表示されません。

上記以外の場合の音声再生、及び動画の再生には外部プログラムが必要になります。 ndeb-binary-programsは例えば以下のように設定します。

(setq ndeb-binary-programs
      '((wave "mplayer")
        (mpeg ("mplayerc" "/play") :direct t)
        (bmp "gv")))

ここではmplayerを音声再生プログラムの例に出していますが、音声の最後が再生されない不具合が確認されています(2006/5/1)ので、mplayerは使わない方がよいようです。 お勧めの外部プログラムがあれば教えてください。

辞書オプション:snd-autoplayの追加

non-nilにするとarrangeの最後で音声を再生します。 補助パッケージを使用している場合はそのままではオプションが有効になりませんのでarrangeを前述のように設定して下さい。

変数ndeb-play-sound-from-entry, ndeb-play-movie-from-entryの追加

これらの変数にkey(define-keyのdocstringを参照して下さい)を指定する事でEntryモードから音声・動画の再生が可能になります。 例えば、以下の様な内容を~/.lookupに記述を行います。

(setq ndeb-play-sound-from-entry "z")
(setq ndeb-play-movie-from-entry "x")

上記の場合、Entryモードからzを押す事でカーソル位置にあるentryの音声を、xを押す事で動画を再生します。 この際にprefix argumentを指定すると、先頭からn番目の音声、あるいは動画を再生できます。

尚、これらの変数による設定は、後述する変数ndeb-play-binaries-from-entryで、ほぼ同様の事が行えます。 違いはdescribe-keyの時の表示とエラーメッセージの一部だけ(の筈)です。 また、ndeb-play-binaries-from-entryも含め、同じkeyを指定した場合はndeb-play-binaries-from-entryndeb-play-movie-from-entryndeb-play-sound-from-entryの順に設定が優先されます。

変数ndeb-play-binaries-from-entryの追加

この変数にkey(define-keyのdocstringを参照して下さい)とリンクのタイプを指定したリストのリストを設定する事でEntryモードから音声・動画・画像の再生が可能になります。 例えば、以下の様な内容を~/.lookupに記述を行います。

(setq ndeb-play-binaries-from-entry
      '(("z" wave)
        ("x" mpeg)))

上記の場合、Entryモードからzを押す事でカーソル位置にあるentryの音声を、xを押す事で動画を再生します。 この際にprefix argumentを指定すると、先頭からn番目の音声、あるいは動画を再生できます。 変数ndeb-play-sound-from-entry, ndeb-play-movie-from-entryの設定例と同じ状態になる設定です。

リンクのタイプは複数指定する事も可能です。

(setq ndeb-play-binaries-from-entry
      '(("z" wave mpeg)
        ("x" xbm bmp jpeg)))

上記の場合、Entryモードからzを押す事でカーソル位置にあるentryの最初にある音声または動画を、xを押す事でentryの最初にある画像を再生します。 この際にprefix argumentを指定すると、keyに対応するタイプのうち、先頭からn番目のリンクを再生できます。

BMPイメージの表示方法の変更、変数ndeb-binary-bmp-display-typeの追加

BMPイメージの表示についてですが、Lookup 1.4では一旦TIFFファイルに変換してから表示しています(ちなみにTIFFイメージが扱えない場合はBMPイメージとして直接表示、それもできない場合は表示しないという実装になっています)。 Lookup 1.4+mediaでは、BMPで直接表示、ppm、TIFFの順番で表示に使える画像形式を調べるようにしました。 TIFFよりppmを優先して使用するようにしたのは、TIFFは避けたほうがよいという意見があったのと、私のところではNTEmacsでeblookが出力するTIFFファイルを表示できなかった為です。

実際に表示に使用する形式はndeb-binary-bmp-display-typeに設定されます。 不都合がある場合は~/.lookupで直接指定する事もできます。

インライン画像の表示方法の変更

Lookup 1.4では画像は全て前後に改行をはさんで表示するようにしていますが、(理化学辞典等でよく使われている)インライン画像に関しては本文のテキスト中に、改行をはさまずに表示するようになります。 eblookへのパッチも必要です。 尚、この変更により、ndeb-arrange-fill-linesがうまく動かない場合が出てくると思われます。

画像のリサイズに対応
変数ndeb-max-image-width, ndeb-max-image-heightの追加

Emacsがサポートしている場合は画像の表示時に縮小表示が可能です。 Emacsは27以降か、24.4以降 (要ImageMagickサポート) が必要です。 変数ndeb-max-image-width, ndeb-max-image-heightに整数を指定した場合はそのピクセル数を超えないように、少数を指定した場合はフレームの大きさからの比率を超えないように縮小します。 拡大はしません。

変数ndeb-gaiji-sizeの追加、辞書オプション・エージェントオプション:gaiji-sizeの追加

ndebエージェントでビットマップイメージによる外字表示を行っている場合、辞書が対応していれば外字の大きさをより大きなものに変更できるようになります。 変数ndeb-gaiji-sizeに、使用する外字の大きさ(高さ)を整数値で指定して下さい。 通常は16, 24, 30, 48のいずれかです。 指定した大きさの外字が無い場合は指定した値を越えない最も大きな外字を探し、それも無い場合は16ドットの外字を使用します。

個々の辞書について指定する場合は辞書オプションまたはエージェントオプション:gaiji-sizeを整数値で指定して下さい。 オプションで指定した大きさの外字が無い場合は16ドットの外字を取得します。 オプションが指定されていない辞書については、初めて外字データを取得する際に変数ndeb-gaiji-sizeの値に応じて自動的にオプションが設定されます。

図版メニューの表示

EPWINGの広辞苑第五版などに含まれる図版メニューに対応しました。 パッチをあてたeblookが必要です。 selectモードかentryモードからMを押す(lookup-select-menuまたはlookup-entry-show-menu)事で図版メニューが存在する場合はentryに出現します。 同様にイメージマップも表示できるようになりました。

イメージからの参照先は、画像上の領域を示したリンクとして画像の下に表示されます。 また、emacs22以上では画像をクリックする事で該当する参照先を表示させる事ができます。

ndebのキーワード検索への対応

広辞苑第五版のような条件検索やクロス検索に対応した辞書と20070120以降のeblookを使用する事で、キーワード検索に対応します。 キーワード検索を行うには辞書オプション:default-methodや変数lookup-default-methodを設定するか、検索文字列の先頭に"@"をつけて下さい。 複数語を指定する場合はスペースやタブで区切ります。 例えば、広辞苑第五版では

@犬 猿 雉

のように検索文字列を指定します。 条件検索とクロス検索の両方の結果をそのまま返す為、最大でlookup-max-hitsの倍の項目数がヒットする可能性があります。

ndebでワイルドカード検索に対応

ワイルドカード検索に対応したeblookと、対応した辞書を使用する事でa?ple*の様なパターンで検索できるようになります。

ndebで全文検索に対応

ebestmkが作成するインデックスの検索に対応しました。 インデックスが存在する辞書に対しては、検索方法に全文検索が自動的に追加されます。 実際の検索にはndestエージェントの設定が必要です。

ndebにおけるebnet対応

EB Libraryはversion 4から遠隔サーバにある辞書へのアクセスが可能になりました。 ebnetとはこの際に使用されるプロトコルです。 サーバ側にはebnetdが必要です。 同様の事はndtpによっても可能ですが、ebnetを使用すればndtpでは対応していない画像、音声等のマルチメディアデータが扱えます。 UNIX環境ではEB Libraryがebnetに対応していればeblookも自動的に対応しますが、Windows環境(厳密にはコンパイル時にDOS_FILE_PATHがdefineされる環境)ではeblookのソースにも変更が必要です。

ndeb-program-arguments, ndeb-process-coding-systemの変更

ndeb-program-argumentsが文字列から文字列のリストに変更になりました。 Windows上のeblook.exeが従来のndeb-program-argumentsの値を一つの引数として受け取るので、このままでは空白を含まない一つのオプションしか指定できない為です。 自動的に追加されていた-qオプションもこの変数で指定するようにしています。 また、ndeb-process-coding-systemもEUCに明示的に設定しています。 これらの値を~/.lookupで変更している場合は注意して下さい。

ndebにおける字下げの対応
変数ndeb-minimum-indentの追加
辞書オプション:minimum-indentの追加

EPWING辞書に含まれる字下げ情報に対応しました。 eblook 1.6.1+mediaが必要です。 字下げ量の指定が辞書オプション:minimum-indentで指定された値を越えた場合に、越えた文字数分の字下げを行います。 指定しない場合は変数ndeb-minimum-indentの値が参照されます。 デフォルトでは1です。 字下げ量の最小値が0である書籍を使用している場合はこれらの値を0にした方が良いかもしれません。

ndebにおける上付き・下付き文字への対応
変数ndeb-default-script-heightの追加
辞書オプション:script-heightの追加

EPWING辞書に含まれる上付き・下付き文字情報に対応しました。 文字の大きさは、displayプロパティでheightを設定して変更しています。 設定する値は辞書オプション:script-heightの値が参照されます。 指定されていない場合は変数ndeb-default-script-heightの値が使用されます。 設定できる値に関してはEmacs lispのリファレンスを参照してください。

ndebにおける文字修飾への対応
ndeb-italic-face, ndeb-bold-face, ndeb-emphasis-faceの新設

EPWING辞書に含まれる文字修飾情報に対応しました。 イタリック体・ボールド体についてはeblook 1.6.1+mediaが必要です。 イタリック体・ボールド体・強調表示について、それぞれndeb-italic-face, ndeb-bold-face, ndeb-emphasis-faceを割り当てます。 表示が気に入らない場合はfaceの設定を変更してください。 手抜き実装のため、入れ子になっている場合は一番内側の指定のみ有効になります 。

ndebにおけるUnicode外字拡張表示への対応

Boookendsで提供される書籍で使用されている、Unicode外字拡張表示に対応しました。 eblook 1.6.1+mediaおよびEB Library (4.4.3以降) が必要です。

ndebにおける見出し語への文字修飾情報の出力

ndebエージェントでは、見出し語を得るときはeblookの内部変数decorate-modeoffにする為、上付き・下付き・文字修飾といった情報は捨てていましたが捨てないようにしました。

ndebにおけるJIS X 4081 UTF-8 extensionの書籍への対応

eblookが対応していれば、エージェントオプション:codingutf-8を指定する事でJIS X 4081 UTF-8 extensionの書籍も扱えます。

ndebにおける辞書オプション:backward-methods:backward-headingの新設

:backward-methodsに検索方法のリストを指定した場合にはそれらの検索方法で検索して得られたエントリについて、また、:backward-headingに正規表現を指定した場合はそれに見出しがマッチするエントリについて、エントリの位置は項目の途中を指しているとみなして遡って項目全体を表示するように試みます。 20100515以降のeblook 1.6.1+mediaが必要です。 通常は指定する必要はありません。

ndebエージェントにおけるEBWinのUnicode検索置換ファイルの読み込み
変数ndeb-set-alternates-automaticallyの新設

エージェントの場所として指定したディレクトリ (CATALOGもしくはCATALOGSファイルが存在するディレクトリ)にalternate.iniというファイルがあると、Unicode検索置換ファイルとして読み込みます。 この置換は:expanders:normalizersの処理には影響を与えず、該当するエージェントでの全ての検索時に、実際の検索の直前に常に行われます。 内部的には新設された:alternatesオプションを設定しますが、この部分は変更されるかもしれません。

この動作は変数ndeb-set-alternates-automaticallynil、もしくはエージェントオプション:alternatesが設定されている場合は行われません。

ndebエージェントにおけるEBWinの外字定義ファイルの読み込み
変数ndeb-set-gaiji-table-automaticallyの新設

エージェントの場所として指定したディレクトリ (CATALOGもしくはCATALOGSファイルが存在するディレクトリ)に、例えば辞書の実体が存在するSUBDIRというサブディレクトリとsubdir.mapというファイルがあると、subdir.map外字定義ファイルとして読み込みます。 内部的には:gaiji-tableオプションを設定します。

この動作は変数ndeb-set-gaiji-table-automaticallynil、もしくは辞書オプション:gaiji-tableが指定されている場合は行われません。

ndebsエージェントの新設

ndebsエージェントが新しく使用可能になります。 これはndebエージェントのvariantです。 ndebではエージェント一つに対してeblookのプロセスが一つ必要ですが、ndebsでは複数のエージェントで一つのeblookのプロセスを共有して使います。

利点は起動にかかる時間を短縮できる事と、NTEmacsのように同時に起動できる子プロセスの数に制限がある場合に、制限に届きにくくなる事です。 逆に、UNIX環境やエージェントの数が少ない場合にはあまりメリットはありません。 加えて、検索時にはndebエージェントよりeblookへのコマンドの発行数が増える為、ndebよりも時間がかかるかもしれません。

設定はほとんどndebエージェントと変わりません。例えば、以下のように設定します。

(setq lookup-search-agents
      '((ndebs "/usr/local/dic/kojien")))

エージェントオプション、辞書オプションについてもndebエージェントと同じものがほとんど使えます。 多くのケースでは~/.lookupに書かれたエージェントや辞書名に使用している"ndeb""ndebs"に書き換えるだけでそのまま使えます。 ただし、ndeb-binary-*等のカスタマイズ変数まで書き換えないように注意して下さい。

ndebエージェントと異なり、辞書のあるディレクトリの指定が誤っていた場合等にエラーにならずに辞書数0のエージェントとなります。 また、ndeb-program-arguments, ndeb-process-coding-systemによる指定は無視され、ndebs-program-arguments, ndebs-process-coding-systemが参照されます。 辞書オプション:codingによる指定も無視されますが、エージェントオプションによる指定は有効です。

eblookが対応していれば、エージェントオプション:codingutf-8を指定する事でJIS X 4081 UTF-8 extensionの書籍も扱えます。

変数ndeb-set-coding-automaticallyの新設

この値がnon-nilかつ、ndebsエージェントにおいてエージェントオプション:codingが指定されていない場合、初回アクセス時に自動的にエージェントオプション:codingと、設定されていなければ:charsetsを設定します。 環境によっては初回アクセス時の速度が目に見えて落ちます。 耐えられない人はnilに変更するか、エージェントオプション:codingを全てのndebsエージェントで設定してください。

ndebs辞書における検索方法の自動設定

ndebs辞書では初期化の際に利用可能な検索方法が設定されます。

ndsrdでワイルドカード検索、正規表現検索に対応

a?ple*の様なパターンで検索できるようになります。

ndsrdで検索語の正規化

正規表現検索以外の場合に空白文字などを検索語から取り除くようにしました。

変数ndsrd-program-argumentの追加

ndsrdエージェントがcsrdを呼び出す際に付加するオプションを文字列のリストで指定できるようになりました。 NTemacsからcsrdを呼び出す際に、文字列のコードがEUCだとcsrdにうまく渡されない場合があった為、オプションを指定してシフトjisで呼び出せるようにする為です。

ndspellエージェントにおける候補の並び順の変更

ndspellエージェントが複数の候補を返す際に、ispell等が返すのとは逆の順番に候補を並べていたのを合わせるようにしました。

変数ndspell-ispell-program-argumentsの追加

ndspellエージェントがispellプログラムを起動する際に使用する追加の引数を文字列のリストで指定できます。 デフォルトはnilで、追加の引数はありません。 通常は設定する必要はありません。

ndicエージェントにおけるエージェントオプション:codingの有効化

ndicエージェントでSDIC形式の辞書を検索する場合、エージェントオプション:codingによって辞書の文字コードを指定できます。

文字コードの異なる辞書が混在する場合は辞書のディレクトリを分け、複数のエージェントを設定する必要があります。

ndicエージェントにおけるsalook, saryのサポート

ndicエージェントでSDIC形式の辞書を検索する場合、SUFARY (の古い版) に付属するarrayコマンドを利用することで高速に検索が行えますが、salookコマンド及びsaryに付属するsaryコマンドも利用できるようにしました。 array, salook, saryの順番で検索を行い、最初に見つかったコマンドを使用するようになります。 この時、SDIC辞書オブジェクトのstrategyにはそれぞれarray, salook, saryが指定されます。

sdicf.elを改造して実現していますので、SDICに付属するsdicf.elが読み込まれると機能しません。

ndicエージェントにおける、SDIC辞書での検索結果のソート

SDIC辞書をarraysaryで検索した場合、その結果が辞書の登録順にならない (事がある) ので、見出し語を使ってソートするようにしました (saryは検索結果をソートしていました)。 主に英辞郎対策です。

sdicf.elを改造して実現していますので、SDICに附属するsdicf.elが読み込まれると機能しません。

ndicエージェントにおける、SDIC辞書でのcontentの書式の変更
変数ndic-sdic-default-content-formatの追加
ndicエージェントによるSDIC辞書検索時に辞書オプション:content-formatの追加

元々の設定ではSDIC辞書の内容の表示の際に見出しとの間に空行を挟んで4桁インデントされるなど、かなりゆったりとした表示になっていますが、個人的な好みによりもっと詰めて表示するようにしました。 また、変数ndic-sdic-default-content-formatにformat stringを指定することでカスタマイズ可能としました。 以前と同様の表示にするには(setq ndic-sdic-default-content-format "%snn %sn")と設定してください。 また、辞書オプション:content-formatが設定されている場合はndic-sdic-default-content-formatの代わりに参照されます。

変数ndic-sdic-default-strategyの追加
ndicエージェントによるSDIC辞書検索時にエージェントオプション:sdic-strategyの追加

SDIC辞書に対してエージェントオプション:sdic-strategyにより、SDIC辞書検索時のstrategyを指定できます。 値はそのままsdicf-open関数のSTRATEGY引数として使われます。 指定が無い場合はndic-sdic-default-strategyが使用され、nilの場合はSDIC側のデフォルトに従います。 辞書ごとに異なるstrategyを指定したい場合は辞書のディレクトリを分け、複数のエージェントを設定する必要があります。

ndicエージェントによるSDIC辞書検索時におけるgrepの呼び出し方法の変更
変数sdicf-grep-program-argumentsの追加

egrep, fgrepは利用せず、grepを引数付で呼び出すようにしました。 また、デフォルトではgrep-aオプションを付けて呼び出し、辞書ファイルがバイナリファイルと認識される場合がある問題を回避するようにしました。 あまりないと思いますが、grepが古すぎて-aオプションをサポートしない場合などは変数sdicf-grep-program-argumentsnilにしてください。

sdicf.elを改造して実現していますので、SDICに付属するsdicf.elが読み込まれると機能しません。

ndictエージェントにおける検索文字列のチェックの廃止

ndictエージェントは検索文字列にASCII以外の文字があると検索しないようになっていますが、困る時があるのでチェックしないようにしました。

ndestエージェントの新設

これは、平林幹雄さんが作成された全文検索システムであるHyper Estraierのインデックスを検索するエージェントです。 まだ実験段階のものですが、分けて管理するのが面倒になったので一緒に入っています。 説明は別ページに分けています。

ndwnjエージェントの新設

これは、日本語WordNetのsqlite3用データベースを検索するエージェントです。 説明は別ページに分けています。

ワイルドカード検索と正規表現検索の分離

ワイルドカード検索(?*を使った検索)は、Lookup本体側で正規表現検索としてクエリーを作り、エージェントに渡していました。 しかし、ndsrdやndeb[s]エージェントでは正規表現に変換する前の文字列を受け取った方が都合がいいのと、正規表現検索の書式はエージェント依存という建前から、ワイルドカード検索を検索メソッドの一つになるように変更しました。 正規表現への変換等が必要な場合はエージェントが行わなければなりません。 ワイルドカード検索が可能な辞書はSelectモードではmethodに"w"と表記されるようになります。 また、ワイルドカード検索のクエリーにlookup-query-methodを行うとシンボルwildとなります。

ターミナル上での外字表示の変更

ターミナル等のビットマップイメージでの外字表示ができない環境において、外字テーブル(辞書オプション:gaiji-table)で指定のない文字は<gaiji=za423>等の文字列がそのまま表示されます。 この改造版では代替文字(デフォルトでは"_")が表示されるようになります。

変数lookup-reference-default-captionの追加

referenceを貼り付ける文字列や、referenceの見出しの文字列が指定されていない場合に使われる文字列です。 本来はエージェント側で対応する事のような気もしますが、このパッチではLookup側で対応しています。

大きなサイズの画像表示に関する変更

インラインでの画像表示の際に、画像のサイズがndeb-max-image-sizeバイトよりも大きいと先頭からndeb-max-image-sizeバイトまで読み込んで表示しようとしますが、危険なので読み込まないようになります。

辞書オプション:normalizersの新設

関数名のシンボルもしくは関数名のシンボルと引数のリストを要素とするリストを指定する事で、検索文字列の正規化をかけることができます。 ここで指定された正規化は検索前に常に行われます。 例えば、特定の辞書に対しては検索をかける前に検索文字列のアルファベットから常にアクセントを取り除くといった事が行えます。

関数は第一引数として文字列を受け取り、文字列のリスト、もしくはnilを返すものが利用できます。 関数は指定された順番に、直前の関数が返した文字列に対して実行されます。 例えばa, b, c三つの関数を指定した時に、元の検索文字列が"0"に対して関数a("1" "2")という結果を返した場合、関数b"1""2"をそれぞれ引数として計2回実行されます。 関数bが返した結果が("1" "2")("2" "3")だったとすると、関数c"1""2""3"を引数として3回実行されます。

検索は最後の関数によって得られる文字列のリスト (複数回実行された場合はLookup側でまとめます) を使って行われます。 ndsrdエージェントでは実際に使用している例があります。

予め用意している関数として以下のものがあります。

lookup-normalizer-strip-chars

検索文字列から指定された文字を取り除きます。 追加の引数で取り除く文字のリスト、もしくは取り除く文字を含んだ文字列を指定します。

lookup-normalizer-japanese-old-to-new
lookup-normalizer-japanese-new-to-old

日本語の旧字を新字に、もしくは新字を旧字にそれぞれ変換します。 変換テーブルはLookup 2.0のものを利用しています。 文字コードutf-8が扱える環境が必要です。

lookup-normalizer-strip-latin-alphabet-accent

アルファベットからアクセント類を取り除きます。 変換テーブルはLookup 2.0のものを利用しています。 文字コードutf-8が扱える環境が必要です。

lookup-normalizer-wrapper

追加の引数に、文字列を受け取り文字列を返す関数名のシンボルを指定するとnormlizerとして利用できます。 更に追加の引数があれば呼び出す関数に渡されます。

辞書オプション:expandersの新設
変数lookup-query-expansion-methodsの新設
辞書オプション:expansion-methodsの新設

辞書オプション:expandersは辞書オプション:expander, :expand-filter, :hiragana, :stemmerを統合・拡張したようなオプションです。 指定された内容に基づき、検索の際に対象の辞書でヒットしなかった場合に新たな検索文字列候補により検索をかけ、結果を取捨選択できます。

具体的にはexpanderとfilter関数のconsを要素とするリストを指定します。 expanderに指定できる内容は:normalizersオプションの要素と同様で、関数名のシンボルもしくは関数名のシンボルと引数のリストです。 expanderに指定できる関数の仕様も:normalizersオプションの要素と同様で、また、従来の:expanderオプションで指定できる関数も指定できます。 filter関数は従来の:expand-filterオプションで指定できる関数をそのまま指定できます。 すなわち、文字列とエントリのリストを取り、エントリのリストを返す関数名のシンボル、もしくはnilが利用できます。 nilの場合は得られた全てのエントリを結果として用います。

指定された順番にexpanderによる検索とfilterによる選別を行い、最初にエントリが得られた時点で検索を打ち切ります。 例えば従来の:hiraganaオプションと:stemmerオプションでstem-english関数を指定した状態と同等にする場合は

(lookup-set-dictionary-option
 "dictionary-id" ':expanders
 '((lookup-kanji-get-readings . lookup-kanji-filter)
   (stem-english . nil)))

のように設定します。

尚、デフォルトの設定ではワイルドカード検索・正規表現検索・全文検索時にはexpander/filterによる拡張検索は行いません。 これは、辞書オプション:expansion-methodsもしくは変数lookup-query-expansion-methodsで設定できます。 いずれの場合も拡張検索を行う検索方法のシンボルのリストを指定します。 勿論辞書オプションの方が優先されます。

辞書オプション:override-methodsの新設

辞書に設定された、normalizerやexpander等の検索語の調整を、検索方法に依存して上書きできます。 ndebエージェントにおける全文検索等、後付けで検索方法を追加した場合等を想定しています。 :charsets, :coding, :alternates, :normalizers, :expanders, :hiraganaおよび:stemmerオプションを上書きできます。 具体的な設定方法はndeb.elでの使用例を参照してください。

辞書オプション:expander, :expand-filterの廃止

上述の様に、辞書オプション:expandersオプションに統合されたので廃止しました。 :hiragana, :stemmerオプションは使用可能です。

変数lookup-expanded-heading-prefixの新設

expander/filterによる拡張検索でヒットしたエントリの見出しの先頭につける文字列を指定します。 文字列は拡張検索をかける前の検索語を引数にしてformat関数にかけ、その結果を表示に用います。 エントリの本来の見出しはその後に続いて表示されます。

辞書オプション:charsetsの新設

キャラクターセットのリストを指定します。 指定されたキャラクターセットのいずれにも存在しない文字を検索文字列が含んでいた場合に検索を試みなくなります。 不要な検索を試みないことで検索時間の短縮を図ることができます。

このオプションはLookup 2.0に実装されたものを移植したものです。

辞書オプション:codingの拡張

検索文字列が指定された文字コードで正しくエンコードできない場合には検索を試みなくなります。:charsetsオプションが指定されている場合はこのチェックは行われません。

辞書オプション:reference-regexpの新設

referenceの開始・終了文字列の正規表現のconsを設定する事で、関数lookup-arrange-referenceが辞書オプション:reference-patternに従ってreferenceを検索する際の検索範囲を制限します。 通常、ユーザが直接指定する事はありません。

辞書コマンドsetup-dictionaryの新設

辞書の初期化時にエージェント/辞書に特有の処理を加えることができるようになります。 辞書IDは設定されていますが、辞書のタイトル、拡張検索の検索方法の一覧への追加、外字テーブルの設定等は行われていない段階で設定されたコマンドが呼び出されます。 通常、ユーザーが直接指定する事はありません。

検索語の切り出し、ndkksエージェント、lookup-kanji-get-readings関数の統合

Lookupではテキストからの検索語の切り出し、読みを検索するndkksエージェント、漢字を含む検索語から読みを検索するlookup-kanji-get-readings関数において形態素解析エンジンとしてKAKASIを利用しています。 Lookup 1.4+mediaでは、これらのコードを統合し、また、ChaSenMeCabの様な他の形態素解析エンジンを利用しやすいように変更を加えています。 詳しい変更内容は別ページにて解説します。

キャッシュ機構の新設

外部ファイルに保存することでLookupやEmacs終了後も内容を保持できるキャッシュ機構を導入しました。 EPWING書籍の副本の一覧や、ndicエージェントにおけるディレクトリ中のファイル一覧等、一度設定してしまえばあまり変更されないであろう部分をキャッシュさせることで起動にかかる時間を短縮させるのがねらいです。

デフォルトでは~/.lookup-cacheにキャッシュの内容を保持します。 ファイル名は変数lookup-cache-file-nameで変更できます。 また、キャッシュファイルの文字コードはlookup-cache-file-coding-systemで指定できます。 例えば以下のような記述を~/.lookupに追加します。

(setq lookup-cache-file-coding-system 'emacs-mule-unix)

lookup-enable-cachenilにするとキャッシュは無効になりますが、キャッシュデータの収集と保存は行われます。

キャッシュの内容と実際の状態に不整合が生じた場合はキャッシュをクリアしてください。 Lookupを起動した事があるEmacsを全て終了させた状態でキャッシュファイル(デフォルトでは~/.lookup-cache)を削除するか、M-x lookup-cache-clearM-x lookup-cache-saveを実行してEmacsを終了すればクリアできます。

現在キャッシュしている内容は以下の通りです。

ndebsエージェント

各エージェントにおける書籍の一覧。各辞書におけるメニューの有無・利用可能な外字サイズの一覧・利用可能な検索方法の一覧。

ndicエージェント

各エージェントにおけるファイル名の一覧。dictd形式の辞書における(インデックスではない)辞書ファイル名。

ndictエージェント

サーバーのプログラム名と辞書の一覧。

補助パッケージの自動読み込み

Lookupには個々のエージェントや辞書の細かな調整を行うために補助パッケージという仕組みが存在しています。 通常、補助パッケージの利用は~/.lookup等でlookup-use-package関数を使用して明示的に読み込む必要がありますが、ndeb, ndebs, ndic, ndsrdエージェントで、辞書の場所として指定されたディレクトリに特定の名前の補助パッケージを置くことで自動的に読み込むようになります。

デフォルトでは例えば/path/to/DIRECTORYというディレクトリが指定されているエージェントでは/path/to/directory/directory-pkg.elというファイルがあれば補助パッケージとして読み込まれます。 読み込みはエージェントのセットアップの際に行われ、~/.lookup等で同一のエージェントに対して別の補助パッケージを指定している場合も設定を上書きします。 -pkgの部分はlookup-package-autoload-suffixで文字列を指定できます。

また、この機能は変数lookup-enable-package-autoloadnilにするかエージェントオプション:package-autoloadを負数にすると無効になります。

フレームローカル変数使用の取りやめ

lookup-fill-columnlookup-window-heightはフレームローカル変数として定義していましたが、新しいEmacsではフレームローカル変数自体が廃止となります。 そのため、これらの変数は通常の変数とし、代わりにフレームパラメータを参照するようにしました。 フレームパラメータに同名のパラメータがあった場合はそれぞれの変数に優先して使用されます。 例えば、lookup-frame-alist変数のデフォルト値にはlookup-fill-columnパラメータが指定されています。

ドキュメントの更新、info形式のファイルの削除

texi/lookup.texitexi/lookup-guide.texiを更新しました。 元が古いこともあって、現状にそぐわない点とか表現の統一が取れてない点とかまだまだあると思います。 修正・追記案等あればお知らせ下さい。

また、Lookupのパッケージにはinfo形式のファイルが同梱されていますが、Lookup 1.4+mediaではパッケージから外しています。 インストール時には Emacs を使って自動的に生成します。

バージョン番号の変更

バージョン番号は1.4から1.4+media-yyyymmddに変更されます。 splash画面、関数lookup-version、変数lookup-versionで確認できます。

修正される不具合

native compilationへの対応

Lookupのソースファイルをバイトコンパイルする際にはlookup-byte-compilenon-nilにする必要があったり、splash画像を取り込んだりとトリッキーな事を行っています。 この為、Emacsから単純にバイトコンパイルできることを想定したパッケージシステムや、Emacs 28から使用可能になったnative compilationと極めて相性が悪いです。 今後、native compilationができないのは困りそうなので、単純にバイトコンパイルできるように変更しました。 (まだ) lexical bindingにはなっていません。

ndeb[s]エージェントでのの改行処理

ndeb, ndebsエージェントでのcontentの表示の際にlookup-arrange-fill-linesでの改行処理がうまくいかずに折り返しが生じることがあります。 不完全ですが応急的に対処しました。

eblookの起動

eblookを起動した際にエラーがあった場合にlookup-debug-modeの値によって挙動が異なります。 また、Windows環境ではeblookの文字コードの指定に不具合があります。

ndkksと:hiraganaオプション

MS WindowsやOS/2環境においてはkakasiを-uオプション付きで起動させないとうまく機能しません。

ndspellにおける異常動作

ndspellが返す候補を再検索した際に一つもマッチしなかった場合に動作がおかしくなります。 マッチしなかった場合は、ndspell自身がentryを一つ返すようにしました。

外字によるreferenceの分断

referenceの文字列内に外字があるとreferenceが分断されます。 Entryモードでこのようなreferenceがあるentry上でLを押すと分断されたreferenceに応じて多数のreferenceがentryに並びます。

連続する外字の表示

同じ外字が連続する場合に1つしか表示されません。

文字等を含まないreference

ndebエージェントで、referenceの開始タグと終了タグの間に何も含まれない場合にreferenceが生成されません。 EPWINGの書籍で、メニューからreferenceをたどると該当するreferenceを認める事があるようです。

splashの表示

bitmap-muleとMule-UCSを併用している場合にsplashが正しく表示されません。 Lookup 1.4+mediaではbitmap-muleによるsplash表示はサポートしないので影響を受けません。 また、NTEmacsでsplashの表示ができないバグも修正しています。

インタラクティブなインストール時の不具合

Lookupには、インストールの手段の一つとして、Emacsを起動し、diredからinstall.elLで実行してインストールするという方法があります。 しかし、画像表示が可能な状態のEmacsでこの操作を行うと、ファイルのコピーは終了するものの途中でエラーになってしまいます。

message関数呼び出し時の不具合

message関数の呼び出し時に表示させたい文字列をformat-stringとして与えている部分がありますが、明らかに問題のない部分を除いてformat-stringを指定するように変更しました。

この変更をしない場合、例えばモジュール名に'%'を含むモジュールにlookup-module-forwardlookup-module-backwardで切り替えた時にエラーになります。

splash表示後の不具合

Lookupを起動させた時のbufferによってはsplash表示後に元のbufferに戻らない事があります。 lookup-pattern関数等によって初回起動した際にこの現象が起きると、コマンド実行時とは異なるbufferから単語をピックアップしてしまいます。

adjust関数実行後のポイント位置に関する不具合

contentの整形にadjust関数を使用している場合、最後のadjust関数を抜けた際のpointが見えるようにContentバッファは表示されます。 しかし、Contentバッファが予め表示されていた場合には常にバッファの先頭が表示されてしまいます。

著作権情報表示の不具合

Lookupの初回起動直後に、著作権情報の表示に対応した辞書に対してその表示を行おうとするとエラーになります。

補助パッケージを絶対パスで指定する際の不具合

補助パッケージを読み込む際に、lookup-package-directory以外の場所から絶対パスを指定されると、lookup-package-file-directoryの値が不適切なものとなり、特に複数ファイルから成る補助パッケージが正しく動作しません。

更新履歴

2024/03/17 lexical bindingに移行した。 obarrayの作り方が間違っているのを修正した。

2023/08/23 ndwnjエージェントを更新した。

2022/10/10 辞書単独に対して全文検索をかけ (Selectモードで/, lookup-select-text-search)、エントリーが見つからなかった場合に正しくエラーを出すようにした。

2022/10/10 古い記述を削除・修正した。

2022/04/24 ebestmkが作成するインデックの検索に対応した。 平たくいうとEPWINGで全文検索できるようにした。

2022/01/13 makeを使ったインストールで、splash画像が正しくインストールできないのを修正した。

2021/07/11 前回の更新でlookup-kanji.elの読み込み時にエラーが出るようになったのを修正した。 eblookのcoding systemのデフォルトに、(あれば) cp51932を使うようにした。世界大百科事典Toolkitで変換した辞書で、Ⅰ, Ⅱ等が直接テキストに入っている事への対策。

2021/06/13 XEmacsおよび古いEmacs (24.4以前) のサポートを止めた。 lisp/stem-english.el の同梱を止めた。 native compilationが通るようにした。 splash画像を画像のままインストールするようにした。

2020/07/26 ndwnjエージェントを更新した。

2020/04/14 画像の縮小表示に対応した。 eblook-1.6.1+media-20200414の更新に対応した (表示を消すだけ)。

2018/03/25 process-kill-without-queryの廃止に対応した。

2017/01/19 make-variable-frame-localの廃止にちゃんと対応した。 EBWin用のUnicode検索置換ファイルと外字定義ファイルの読み込みがとても遅いのを修正した。

2017/01/12 make-variable-frame-localが廃止されたのにとりあえず対応した。

2016/06/12 ispellの呼び出し時にオプションを追加できるようにした。 ドキュメントを更新した。

2015/09/20 SDICの検索でegrep, fgrepを使うのをやめてgrepを使うようにした。 grep-aオプション付で呼び出すようにした。

古い履歴


Kazuhiro's blog
http://ikazuhiro.s206.xrea.com/staticpages/index.php/lookup