;; $Id: 00readme-namazu.jis,v 1.1.1.1 2008/03/12 10:53:39 makoto Exp $ ;; ;; この file は contrib/mew-nmz.el の readme です。 ;; 0. はじめに mew-nmz.el は Mew からの検索を Namazu を用いて高速化するための emacs lisp です。 Mew の扱う MH 形式の folder と Namazu の INDEX を "一対一" に生成し、folder 単 位でINDEX を指定することによって、高速な検索と木目細やかな制御を両立しています。 1. 準備 1.1. 要求する Version 以下に示す version のソフトウェア群が必要です。 ・Mew => 1.94b20 以降 ・IM => 990405(IM114) 以降 ・Namazu => 動作確認は 1.3.0.6 以降で行ないました。 Namazu に関しては http://openlab.ring.gr.jp/namazu/ を参照して下さい。 1.2. 設定 1.1. に示したソフトウェアが単体で動作したら 'mew-nmz.el' をインストールします。 お好みで byte-compile しましょう。 その後、~/.emacs に (eval-after-load "mew" '(require 'mew-nmz)) を書き、各種変数を設定した後、再立ち上げしましょう。 2. 変数 以下の変数をお使いの環境、趣味に合わせて下さい。なお、変数名の右(下)に示すのは default 値です。 ● mew-nmz-index-path "~/Namazu" mew-nmz-index-mail "Mail" mew-nmz-index-news "News" Namazu の INDEX を作成する directory を指定します。default 設定なら、例えば、 "+inbox" => "~/Namazu/Mail/inbox" "+ml/mew-dist" => "~/Namazu/Mail/ml/mew-dist" "=fj.editor.emacs" => "~/Namazu/News/fj.editor.emacs" に INDEX を作成します。 ● mew-nmz-use-fast-pick t 't' にすると mew-nmz-search(), mew-nmz-virtual() において、可能な限り emacs lisp で summary を作成します。'nil' にすると、いつも IM を用いて summary を作成 します。 ● mew-nmz-use-backslash nil Win32 な人は 't' にして下さい。なお、OS/2 は動作確認が取れていないのですが、't' で動くかもしれません。 ● mew-nmz-prog "namazu" mew-nmz-prog-args '("-aS") Namazu のプログラム名と引数を指定します。 ● mew-nmz-db-max 64 mew-nmz-query-max-length 256 Namazu 動作時の環境を指定します。それぞれ、namazu.h の 'DB_MAX' と 'QUERY_MAX_LENGTH' と同じ値を指定します。 ただし、'Namazu 1.3.0.6 以前' をお使いの方は、mew-nmz-db-max に (- DB_MAX 2) の 値を指定して下さい。 ● mew-nmz-prog-mknmz "mknmz" mew-nmz-prog-mknmz-args '("-uUhP") mew-nmz-prog-mknmz-include "~/Namazu/mknmz-inc.pl" index を作成するプログラム名と引数を指定します。mew-nmz-prog-mknmz-include で示 されるファイルは mknmz 時にインクルードされます。このファイルには ## Namazu 1.3.x なら $SEARCH_FIELD = "Message-Id|Subject|From|Date|Url|Newsgroups|To|Cc|In-Reply-To|References"; ## Namazu 1.4.x なら $conf::SEARCH_FIELD = "Message-Id|Subject|From|Date|Url|Newsgroups|To|Cc|In-Reply-To|References"; の様に書いておくと、Namazu で使用できるフィールド検索項目を増やすことが出来ます。 ● mew-nmz-prog-gcnmz "gcnmz" mew-nmz-use-gcnmz-folders '("+inbox") mew-nmz-mknmz-all-folders() 実行時に gcnmz するプログラム名と対象 folder を指定 します。 mew-nmz-prog-gcnmz => nil なら gcnmz しません。 mew-nmz-use-gcnmz-folders => t なら すべての folder で gcnmz します。 ● mew-nmz-mknmz-skip-folders '("+trash" "+draft" "+draft/mime" "=draft" "=draft/draft") mknmz しない(INDEX を作らない) folder を指定します。 ● mew-nmz-mknmz-skip-news t local news folder の INDEX を作らないとき 't' にします。 ● mew-nmz-mknmz-use-mode-line t mew-nmz-line-id '("Mew(nmz): %7b") INDEX を作成中の folder の summary buffer の mode line をちょっとだけ変えます。 ● mew-nmz-pick-default-field nil mew-nmz-pick-field-list '("+subject:" "+from:" "+to:" "+newsgroups:" "+date:" "+message-id:" "+cc:" "+in-reply-to:" "+references:") mew-nmz-pick-gather-field-list (list (list mew-from: 'address "+from:" "+to:" "+cc:") (list mew-to: 'address "+from:" "+to:" "+cc:") (list mew-cc: 'address "+from:" "+to:" "+cc:") (list mew-message-id: 'msgid "+message-id:" "+in-reply-to:" "+references:") (list mew-in-reply-to: 'msgid "+message-id:" "+in-reply-to:" "+references:") (list mew-references: 'msgid "+message-id:" "+in-reply-to:" "+references:")) Namazu の検索パターンを入力するときの各種設定です。 mew-nmz-pick-field-list に設定されたものが補完として使用できます。 また、mew-nmz-pick-gather-field-list を設定すると、現在表示している Message か ら情報を集めて補完候補として使用します。mew-nmz-pick-gather-field-list => nil と するとこの機能を抑制します。各 cell の 第1cell => 情報を収集する Header の指定。 第2cell => Header 内容の加工。'address と 'msgid が使用できます。 第3cell以降 => 補完出力するときにつける prefix。 をお好みで指定します。 ● mew-nmz-mark-unindexed mew-mark-review mew-nmz-mark-unindexed() するときに使用する mark の種類を指定します。 ● mew-nmz-use-namazu-el (locate-library "namazu") mew-nmz-namazu-full-window t Mew から namazu-mode を使用するときに設定します。Namazu に contrib されている namazu.el が load-path 上にあれば、自動的に使用できるようになります。 3. ユーザインターフェース関数 mew-nmz.el の使い方です。関数名の右側は標準の key bind になります。 3.1. INDEX の作成、支援関数 ● mew-nmz-mknmz() "zm" 指定した folder に対して Namazu INDEX を作成します。"C-u" 付きで実行すると、現 在の INDEX を消去してから Namazu INDEX を作成します。 ● mew-nmz-mknmz-all-folders() "key bind なし" すべての folder に対して、Namazu INDEX を作成します。初めて INDEX を作成すると きは長時間必要となり、その間 Emacs が使えなくなるので注意して下さい。"C-u" 付き で実行すると、folder 情報を update してから INDEX を作成します。 ● mew-nmz-mark-unindexed() "zu" 現在の folder で INDEX が作成されていない Message を mark 付けします。 3.2. 検索、表示関数 ● mew-nmz-search() "z/" 指定した folder を Namazu を用いて検索し、summary buffer を再構築します。このと き、'mew-nmz-use-fast-pick => t' なら emacs lisp を用いて summary buffer を再構 築します。'mew-nmz-use-fast-pick => nil' 及び "C-u" 付きで起動すると、imls を用 いて summary buffer を再構築します。 ● mew-nmz-search-mark() "z?" 指定した folder を Namazu を用いて検索し、mark 付けします。"C-u" 付きで起動する と、region 内の Message を検索対象とします。 ● mew-nmz-virtual() "zV" 指定した複数の folder を Namazu を用いて検索し、virtual folder を作成します。フォ ルダの指定を '*' で終了すると、'*' の前までに合致するすべての folder を検索対象 とします。例えば、以下の様になります。 '*' => すべての local folder を検索する。 '+*' => すべての mail folder を検索する。 '+ml/mew-*' => '+ml/mew-dist', '+ml/mew-win32', '+ml/mew-dist/old' 等を検索する。 ● mew-nmz-namazu() "zN" mew-nmz-virtual と同様の指定を行うと、検索結果を "namazu mode" で表示します。 この検索方法は Namazu に同梱されている "namazu.el" をインストールしないと使用で きません。すでに "*namazu* buffer" が存在すると、"zN" は、その buffer を表示しま す。検索をやり直したいときは、"C-u" 付きで mew-nmz-namazu() を起動します。 このとき、検索対象 folder として、mew-nmz-db-max よりたくさんの folder を指定す ると、mew-nmz-db-max 個以上の folder は無視されます。 "namazu mode" で "m" を押すと、Mew を呼出して対応する Message を表示します。"M" を押すと "namazu mode" を呼び出した folder に戻ります。その他の設定やキーバイン ドなどは "namazu.el" の設定に依存します。 ● mew-nmz-search-parent() "z^" 表示している Message の *親* message を検索し、表示します。"C-u" 付きで起動する と *子* message を検索します。 *親* message を検索するときは、その message の "In-Reply-To:" か "References:" に示される Message ID を "Message-ID:" に持つ message を検索します。 *子* message を検索するときは、その message の Message-ID を "In-Reply-To:" か "References:" に持つ message を検索します。 3.2. virtual mode のおまけ ● mew-virtual-original-message() "zj" virtual folder において、表示している Message の実体の folder、number を表示し ます。"C-u" 付きで起動すると、実体のある場所に jump します。 4. INDEX の作成支援 いつ INDEX を作成するか、更新するか、とても悩ましいところなので、それらをサポー トする関数です。~/.emacs に書いておくと *ある程度* 自動で INDEX を作成しますが、 system に多大な負荷をかけるものもありますので、お好みに合わせてお使い下さい。 ;; inc した後に勝手に mknmz する。message のある無しは、おもいっきり環境依存な ;; 判定方法。 (add-hook 'mew-summary-inc-sentinel-hook '(lambda () (if (functionp 'current-message) (let ((msg (current-message))) (if (string-match "^No" msg) () (mew-nmz-mknmz (mew-inbox-folder)))) (mew-nmz-mknmz (mew-inbox-folder))))) ;; pack した後に勝手に mknmz する。INDEX の remove 付き (defadvice mew-summary-pack (after mknmz-pack-folders activate) (mew-nmz-mknmz (mew-summary-folder-name) t)) ;; sort した後に勝手に mknmz する。INDEX の remove 付き (defadvice mew-summary-sort (after mknmz-sort-folders activate) (mew-nmz-mknmz (mew-summary-folder-name) t)) ;;;; mew-summary-exec の後に mknmz して、index を最新に保つ。 ;;;; 多大な負荷を system にかける。 (defvar mew-nmz-refile-folders nil) (make-local-variable 'mew-nmz-refile-folders) ;; summary-exe する前に情報を収集する。 (defadvice mew-summary-exec-region (before get-refile-folders activate) (save-excursion (save-restriction (narrow-to-region beg end) (goto-char (point-min)) (let (msgs) (setq mew-nmz-refile-folders nil) (setq msgs (mew-summary-mark-collect mew-mark-refile (point-min) (point-max))) (if (or msgs (mew-summary-mark-collect mew-mark-delete (point-min) (point-max))) (setq mew-nmz-refile-folders (list (mew-summary-folder-name)))) (if msgs (mapcar '(lambda (msg) (mapcar '(lambda (fld) (setq mew-nmz-refile-folders (cons fld mew-nmz-refile-folders))) (cdr (assoc msg mew-summary-buffer-refile)))) msgs)))))) ;; summary-exe した後に勝手に mknmz する。 (add-hook 'mew-summary-exec-hook '(lambda () (let ((flds mew-nmz-refile-folders)) (setq mew-nmz-refile-folders nil) (if (null flds) () (while (car flds) (mew-nmz-mknmz (car flds)) (sit-for 1) (setq flds (delete (car flds) flds))))))) 5. その他 5.1. INDEX の大きさ、作成時間など 手元のマシン(SS-20/M-152, SUNOS 5.4)では、このようになっています。 (length mew-folder-alist) => 119 % du -ks ~/Mail/ 302757 /home/shirai/Mail % du -ks ~/Namazu/Mail/ 158939 /home/shirai/Namazu/Mail INDEX が何もない状態で M-x mew-nmz-mknmz-all-folders すると約8時間、Update 目的 で M-x mew-nmz-mknmz-all-folders すると10〜20分かかります。 5.2. 謝辞 Takeshi ITOH さんが 伊藤さん> (2)フォルダ毎にDBを作る 伊藤さん> - 各フォルダに DB を作る。 伊藤さん> - namazu は複数 DB に対応しているのでフォルダ指定の検索も簡単。 伊藤さん> - DBの一覧は C-u Z のときに作る? 伊藤さん> - DBの更新が面倒になる? とおっしゃっていただけなかったら、mew-nmz.el はおかしなものになっていたでしょう。 また、imls の変更はほとんど伊藤さんのものの見よう見まねで作りました。感謝、感謝 です。 バグレポートを下さったり、改善要望を下さった方々もありがとうございます。 当然、Mew や Namazu をお作りになられているすべての方々にも感謝です。(__) ;; end here.