[migemo] Re: migemo 利用時の isearch 以外の lazy-highlight の挙動
M.Fujii
boochang @ m4.kcn.ne.jp
2007年 6月 22日 (金) 14:08:54 JST
藤井です。
# 2 年前のメールのリプライで恐縮です。
From: Hideyuki SHIRAI (白井秀行) <shirai @ meadowy.org>
Subject: [migemo] Re: migemo 利用時の isearch 以外の lazy-highlight の挙動
Date: Fri, 05 Aug 2005 18:29:41 +0900 (JST)
> 現在、migemo な isearch をするときは、search-forward(),
> search-backward() の挙動を migemo-do-isearch の値によって変えて
> いますが、このあたりの「やり方」を変えて、半恒久的な対策をした方
> が良いと思っているのですが、まだうまい考えにはたどり着いていませ
> ん ^^;;;
Emacs 22.1 がリリースされたようなので対応を考えてみました。
私としては、Emacs 22 以降では以下のようにするのが良いと思います。
1. search-forward() 等の挙動を変えるのを止めて
isearch-search-fun-function を設定することにする。
2. isearch-search-fun-function を設定するモードでは、
原則として migemo は使用されない。
そのようなモードで migemo を使用したい場合は個別対応する。
なお、Emacs 22.1 標準のモードのうち isearch-search-fun-function を
設定するモードは以下の 4 つのようです。
- hexl-mode
- info-mode
- longlines-mode
- reftex-isearch-minor-mode
isearch-search-fun-function を設定するモードは isearch に特殊な振舞いを
追加したいという要望がある訳ですが、この特殊な振舞いと migemo の振舞い
をどう折合いを付けるかはそのモードによって異なるはずなので、個別対応し
た方が良いのではないかと思います。
個別対応の方針ですが、migemo.el で個別対応の枠組みを提供する必要はなく、
各モードで isearch-search-fun-function に設定される関数に対して
defadvice して振舞いを変えるというので十分ではないかと思います。
検討よろしくお願いします。
また、上記のように振舞いを変えるパッチを作成してみました。添付しますの
で、試してみてください。
パッチを適用することによって Emacs 22 以降では、migemo.el は以下のよう
に変わります。(Emacs 21 以前では振舞いは変わりません)
ユーザレベルでの変更:
- query-replace で置換される文字列が正しくハイライトされるようになり
ました。
- 以下の 4 つのモードでは migemo が無効になるようにしました。
- hexl-mode
- info-mode
- longlines-mode
- reftex-isearch-minor-mode
実装レベルでの変更:
- 以下の関数の振舞いを変更しないようにしました。
search-forward, search-backward, isearch-search-and-update,
isearch-lazy-highlight-search
- migemo-isearch-search-function() を追加しました。
(この関数で isearch の振舞いを変えます)
- migemo-init() において isearch-search-fun-function に
migemo-isearch-search-function を設定するようにしました。
- 定数 migemo-emacs22p を導入しました。
上記の変更はすべてこの定数で条件分岐しています。
--
藤井 正行 / Masayuki FUJII
-------------- next part --------------
Index: migemo.el.in
===================================================================
RCS file: /cvsroot/migemo/migemo/migemo.el.in,v
retrieving revision 1.8
diff -u -r1.8 migemo.el.in
--- migemo.el.in 22 Sep 2006 08:43:33 -0000 1.8
+++ migemo.el.in 22 Jun 2007 04:55:22 -0000
@@ -155,6 +155,7 @@
(defvar migemo-pattern-alist nil)
(defvar migemo-frequent-pattern-alist nil)
(defconst migemo-emacs21p (and (> emacs-major-version 20) (not (featurep 'xemacs))))
+(defconst migemo-emacs22p (and (> emacs-major-version 21) (not (featurep 'xemacs))))
(defvar migemo-search-pattern-alist nil)
(defvar migemo-do-isearch nil)
@@ -211,7 +212,9 @@
(setq migemo-process (migemo-start-process
"migemo" migemo-buffer migemo-command options))
(process-kill-without-query migemo-process)
- t)))
+ t))
+ (when migemo-emacs22p
+ (setq isearch-search-fun-function 'migemo-isearch-search-function)))
(defun migemo-replace-in-string (string from to)
(with-temp-buffer
@@ -379,6 +382,19 @@
(delete-region (point) pos)
(insert jrpat))))
+(defun migemo-isearch-search-function ()
+ (if (and migemo-isearch-enable-p
+ (not (or isearch-regexp isearch-word)))
+ (lambda (string &optional bound noerror count)
+ (funcall
+ (if isearch-forward 're-search-forward 're-search-backward)
+ (if (delq 'ascii (find-charset-string string))
+ string
+ (migemo-search-pattern-get string))
+ bound noerror count))
+ (let ((isearch-search-fun-function nil))
+ (isearch-search-fun))))
+
(defun migemo-forward (word &optional bound noerror count)
(interactive "sSearch: \nP\nP")
(if (delq 'ascii (find-charset-string word))
@@ -511,28 +527,29 @@
ad-do-it
(setq migemo-do-isearch nil)))
-(defadvice isearch-search-and-update (around migemo-search-ad activate)
- "adviced by migemo."
- (let ((isearch-adjusted isearch-adjusted))
- (when (and migemo-isearch-enable-p
- (not isearch-forward) (not isearch-regexp) (not isearch-word))
- ;; don't use 'looking-at'
- (setq isearch-adjusted t))
- ad-do-it))
+(unless migemo-emacs22p
+ (defadvice isearch-search-and-update (around migemo-search-ad activate)
+ "adviced by migemo."
+ (let ((isearch-adjusted isearch-adjusted))
+ (when (and migemo-isearch-enable-p
+ (not isearch-forward) (not isearch-regexp) (not isearch-word))
+ ;; don't use 'looking-at'
+ (setq isearch-adjusted t))
+ ad-do-it))
-(defadvice search-forward (around migemo-search-ad activate)
- "adviced by migemo."
- (if migemo-do-isearch
- (setq ad-return-value
- (migemo-forward (ad-get-arg 0) (ad-get-arg 1) (ad-get-arg 2) (ad-get-arg 3)))
- ad-do-it))
+ (defadvice search-forward (around migemo-search-ad activate)
+ "adviced by migemo."
+ (if migemo-do-isearch
+ (setq ad-return-value
+ (migemo-forward (ad-get-arg 0) (ad-get-arg 1) (ad-get-arg 2) (ad-get-arg 3)))
+ ad-do-it))
-(defadvice search-backward (around migemo-search-ad activate)
- "adviced by migemo."
- (if migemo-do-isearch
- (setq ad-return-value
- (migemo-backward (ad-get-arg 0) (ad-get-arg 1) (ad-get-arg 2) (ad-get-arg 3)))
- ad-do-it))
+ (defadvice search-backward (around migemo-search-ad activate)
+ "adviced by migemo."
+ (if migemo-do-isearch
+ (setq ad-return-value
+ (migemo-backward (ad-get-arg 0) (ad-get-arg 1) (ad-get-arg 2) (ad-get-arg 3)))
+ ad-do-it)))
;; Turn off input-method automatically when C-s or C-r are typed.
(defadvice isearch-mode (before migemo-search-ad activate)
@@ -572,6 +589,9 @@
(when migemo-emacs21p
(put-text-property 0 (length str) 'face migemo-message-prefix-face str))
(when (and migemo-isearch-enable-p
+ (or (not migemo-emacs22p)
+ (eq isearch-search-fun-function
+ 'migemo-isearch-search-function))
(not (or isearch-regexp isearch-word)))
(setq ad-return-value (concat str " " ret)))))
@@ -609,7 +629,8 @@
(window-start)))
t)))
-(when (fboundp 'isearch-lazy-highlight-search)
+(when (and (not migemo-emacs22p)
+ (fboundp 'isearch-lazy-highlight-search))
(defalias 'isearch-lazy-highlight-search 'migemo-isearch-lazy-highlight-search))
;;;; for isearch-highlightify-region (XEmacs 21)
Migemo メーリングリストの案内