[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 メーリングリストの案内