xyzzy の grep で Freemind のファイルを検索

FreeMind用検索ユーティリティ『ozFreeMindSearcher 0.9.0 RC3』 - 手帳と書斎とパソコンの深い森で http://blog.ohzapper.com/2009/05/06/002479.html

xyzzygrep でも検索できるといいなと思ったので試してみた。
grep のフックでファイルを読み込んだときに文字のアンエスケープをしてやればいいはず。
試しなので強引にいく。

grep でファイルを読み込むところにフックを追加。

--- grepd.l.org	Sun Jun 15 18:28:24 2003
+++ grepd.l	Sat Apr 17 17:38:16 2010
@@ -9,12 +9,13 @@
 
 (in-package "editor")
 
-(export '(grep-dialog *grep-directory-name-hook* *grepd-hook*))
+(export '(grep-dialog *grep-directory-name-hook* *grepd-hook* *grepd-file-hook*))
 
 (defvar *last-grepd-regexp* "")
 (defvar *regexp-search* nil)
 (defvar *understand-escape-sequences* nil)
 (defvar *grepd-hook* nil)
+(defvar *grepd-file-hook* nil)
 
 (define-history-variable *grep-directory-history* nil)
 (define-history-variable *grep-file-history* nil)
@@ -35,7 +36,10 @@
       (progn
 	(set-buffer buffer)
 	(erase-buffer buffer)
-	(ignore-errors (insert-file-contents file))))
+	(ignore-errors
+         (insert-file-contents file)
+         (run-hooks '*grepd-file-hook*)
+         )))
     (save-excursion
       (goto-char (point-min))
       (message "scanning (~A)" file)

バイトコンパイルして xyzzy のダンプファイルも作り直し。
scratch バッファで以下を実行して、追加したフックにアンエスケープの関数を追加。

(defun unescape-mm-grep-hook ()
    (unescape-mm-buffer))
(add-hook '*grepd-file-hook* 'unescape-mm-grep-hook)

unescape-mm-buffer は miyamuko さんが書かれていたもの使わせてもらう。
http://capsctrl.que.jp/kdmsnr/diary/20051005.html

(defun unescape-mm-region (s e)
  (interactive "*r")
  (if (< e s) (rotatef s e))
  (save-excursion
    (save-restriction
      (narrow-to-region s e)
      (goto-char (point-min))
      (while (scan-buffer "&#x\\([0-9a-fA-F]+\\);" :tail t :regexp t)
        (insert (unicode-char (parse-integer (match-string 1) :radix 16)))
        (delete-region (match-beginning 0) (match-end 0))))))

これで grep-dialog で日本語の検索ができるようになった。
まともに使うなら FreeMind ファイル検索用の関数を作った方がいいんだろうな。