これは前回の投稿の続きです ( Emacs で isearch-forward の前に入力文字列を前処理することは可能ですか)。jpkotta
変数を使用しての回答を実装しようとしていますisearch-search-fun-function
。独自の関数を記述する代わりに、「abc」と入力するたびに isearch が regexp を強調表示して検索するようisearch-search-fun-default
に、独自の関数 (isearch-str-forward
および、デモの目的で) を含めることをお勧めします。isearch-str-backward
a[ ]*b[ ]*c[ ]*
問題は、関数にアドバイスしてから「abc」のisearchを実行すると、エラーが発生したことですI-search: abc [(void-function nil)]
。しかし、コードをdefadvise
元のisearch-search-fun-default
関数に入れると、うまくいきます! だから私は混乱します。Elisp のマニュアルad-do-it
では、元の関数コードのプレースホルダーに過ぎないと述べているため、これらの 2 つのアプローチ (関数にアドバイスするか、元の関数を変更する) は、最終的に同じコードを生成するはずです。アドバイスするとエラーになるのはなぜですか?
(defun isearch-mangle-str (str)
"For input STR \"abc\", it will return \"a[ ]*b[ ]*c[ ]*\"."
(let ((i 0) (out ""))
(dotimes (i (length str))
(setq out (concat out (substring str i (1+ i)) "[ ]" "*")))
out))
(defun isearch-str-forward (str &optional bound noerror)
"Search forward for STR."
(let ((string (isearch-mangle-str str)))
(re-search-forward string bound noerror)))
(defun isearch-str-backward (str &optional bound noerror)
"Search backward for STR."
(let ((string (isearch-mangle-str str)))
(re-search-backward string bound noerror)))
(defvar my-search-p t)
(defadvice isearch-search-fun-default (around my-isearch-search-fun activate)
(if my-search-p
(if isearch-forward 'isearch-str-forward
'isearch-str-backward)
ad-do-it))