xyzzy の grep で Freemind のファイルを検索
FreeMind用検索ユーティリティ『ozFreeMindSearcher 0.9.0 RC3』 - 手帳と書斎とパソコンの深い森で http://blog.ohzapper.com/2009/05/06/002479.html
xyzzy の grep でも検索できるといいなと思ったので試してみた。
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 ファイル検索用の関数を作った方がいいんだろうな。