[mew-win32 04276] [test2]GDS for Mew.

Shuichi KITAGUCHI ki at example.com
2005年 7月 17日 (日) 21:28:40 JST


北口です。

まだいい加減ですが、Google Desktop Search(以下GDS)をMewからの検索に利用する
テストその2です。Spotlight用コードをコピーしまくって、基本操作はMew上から
できるようになりました。

・必要なもの
  - Google Desktop Search
  - Ruby 1.8以降
    私は One-Click Ruby Installer (http://rubyforge.org/projects/rubyinstaller/)
    使ってます。
  - コマンド
    http://www.ysnb.net/kit/tmp/2005071701/gdsgrep.rb.bz2

・インストール
  - mew-win32.elに添付のパッチを当てる。
  - gdsgrep.rb をパスの通った場所(Meadow/binあたりが妥当と思う)に入れる。
    (必要に応じて先頭行を書き換えてください)

・index作成
  - コンポーネント登録
    kR (ダイアログが出てくるのでOKしてください)
  - インデックス作成
    kM (全部) or km (1フォルダのみ)
  - コンポーネント登録解除
    kU

・検索
  k/ (これしかありません。また、書けるキーワードはアルファベットの単語1つのみ)

・注意その他
  - 文字コードは、SJIS(決め打ち)に変換してから登録しています。
    (最終的には、UTF-8で登録した方が良いと思っています)
  - メールの解析は、mailreadモジュールがやってくれる簡易なものだけです。
  - インデックス作成時は一旦COMのコンポーネントの登録をやりますので、解除を
    忘れずにやりましょう。
  - インデックス作成は、結構時間がかかります。特にkMをやる時は心して実行
    してください。
    (私のPentium-M 1.1GHzのノートで、他に何もしていない状態で約4万通を処理
     するのに50分程度かかります)

・TODO
  - 検索の充実
    * 日本語検索とかのためにちゃんとエンコードする
    * 複数キーワード検索
    * その他
  - インデックスエンジン切り替え
    WindowsではNamazuとGDSが使えるし、MacOS XではNamazuとSpotlightが使えるし、
    と切り替えて使いたいこともあると思うので、mew-index-engine-specとかを
    作って呼び出し元で切り替える?


--
Shuichi Kitaguchi // kit at example.com / ki at example.com
-------------- next part --------------
Index: mew-win32.el
===================================================================
RCS file: /cvsmew/mew/mew-win32.el,v
retrieving revision 1.49
diff -u -r1.49 mew-win32.el
--- mew-win32.el	12 Jul 2005 05:29:48 -0000	1.49
+++ mew-win32.el	17 Jul 2005 12:06:41 -0000
@@ -208,11 +208,11 @@
 ;; Should be replaced with google
 
 (define-key mew-summary-mode-map "k?" 'mew-nmz-search-mark)
-(define-key mew-summary-mode-map "k/" 'mew-nmz-virtual)
+;(define-key mew-summary-mode-map "k/" 'mew-nmz-virtual)
 (define-key mew-summary-mode-map "kV" 'mew-nmz-virtual)
 (define-key mew-summary-mode-map "kg" 'mew-nmz-gcnmz)
-(define-key mew-summary-mode-map "km" 'mew-nmz-mknmz)
-(define-key mew-summary-mode-map "kM" 'mew-nmz-mknmz-all-folders)
+;(define-key mew-summary-mode-map "km" 'mew-nmz-mknmz)
+;(define-key mew-summary-mode-map "kM" 'mew-nmz-mknmz-all-folders)
 (define-key mew-summary-mode-map "ks" 'mew-nmz-mknmz-save-mewmknmz)
 (define-key mew-summary-mode-map "kK" 'mew-nmz-mknmz-kill-process)
 (define-key mew-summary-mode-map "ku" 'mew-nmz-mark-unindexed)
@@ -222,6 +222,67 @@
 (define-key mew-summary-mode-map "kN" 'mew-nmz-namazu)
 (define-key mew-summary-mode-map "kj" 'mew-nmz-original-message)
 
+;; XXX: supporting Google Desktop Search (GDS)
+(define-key mew-summary-mode-map "k/" 'mew-summary-virtual-with-index)
+(define-key mew-summary-mode-map "km" 'mew-gds-index-folder)
+(define-key mew-summary-mode-map "kM" 'mew-gds-index-all)
+(define-key mew-summary-mode-map "kR" 'mew-gds-register)
+(define-key mew-summary-mode-map "kU" 'mew-gds-unregister)
+
+(setq mew-summary-virtual-with-index-function
+      'mew-summary-virtual-with-gds)
+
+(defun mew-gds-register ()
+  "Register Google Desktop Search component"
+  (interactive)
+  (message "Registering GDS component...")
+  (call-process "gdsgrep.rb" nil nil nil "-R")
+  (message "Registering GDS component...done"))
+
+(defun mew-gds-unregister ()
+  "Unregister Google Desktop Search component"
+  (interactive)
+  (message "Unregistering GDS component...")
+  (call-process "gdsgrep.rb" nil nil nil "-U")
+  (message "Unregistering GDS component...done"))
+
+(defun mew-gds-index-folder ()
+  "Making Google Desktop Search index for this folder"
+  (interactive)
+  (let* ((fld (mew-input-folder (mew-sinfo-get-case) (mew-sinfo-get-folder)))
+	 (dir (mew-expand-folder fld)))
+    (start-process "gdsgrep.rb" nil "gdsgrep.rb" "-m" "-i" dir)
+    (message "Indexing %s in background..." fld)))
+  
+(defun mew-gds-index-all ()
+  "Making Google Desktop Search index for all folders."
+  (interactive)
+  (start-process "gdsgrep.rb" nil "gdsgrep.rb" "-m" "-r" "-i" (mew-expand-folder "+"))
+  (message "Indexing for all messages in background..."))
+
+(defun mew-summary-virtual-with-gds (dummy pattern) 
+  (let* ((file (mew-make-temp-name))
+	 (maildir (mew-expand-folder mew-mail-path))
+	 (mail-regex (regexp-quote (file-name-as-directory maildir)))
+	 (regex (concat "^" mail-regex "\\(.*\\)/" "\\([0-9]+\\)"))
+	 (prev "") (rttl 0) crnt)
+    (mew-plet
+     (call-process "gdsgrep.rb" nil t nil "-m" "-p" maildir "-s" "-q" pattern))
+    (goto-char (point-min))
+    (while (looking-at regex)
+      (setq rttl (1+ rttl))
+      (setq crnt (match-string 1))
+      (delete-region (match-beginning 0) (match-beginning 2))
+      (when (not (string= crnt prev))
+	(beginning-of-line)
+	(insert "CD:" mew-folder-local crnt "\n"))
+      (setq prev crnt)
+      (forward-line))
+    (mew-frwlet
+     mew-cs-text-for-read mew-cs-text-for-write
+     (write-region (point-min) (point-max) file nil 'no-msg))
+    (list file rttl)))
+
 (defun mew-set-file-type (file) ())
 
 (provide 'mew-win32)


Mew-win32 メーリングリストの案内