Это продолжение моего предыдущего поста (можно ли предварительно обработать входную строку перед поиском вперед в Emacs). Я пытаюсь реализовать ответ jpkotta
, используя переменную isearch-search-fun-function
. Вместо того, чтобы писать свою собственную функцию, я просто советую isearch-search-fun-default
включить мои собственные функции (isearch-str-forward
и isearch-str-backward
, просто для демонстрации), чтобы каждый раз, когда я набираю "abc", isearch выделял и искал регулярное выражение a[ ]*b[ ]*c[ ]*
.
Проблема в том, что когда я посоветовал функцию, а затем выполнить поиск «abc», она выдала мне ошибку I-search: abc [(void-function nil)]
. Но если я вставлю код внутри моего defadvise
в исходную функцию isearch-search-fun-default
, он сработает! Так что я путаюсь. В руководстве к Elisp сказано, что ad-do-it
— это просто заполнитель для исходного кода функции, поэтому эти два подхода, совет функции или изменение исходной функции, должны, наконец, генерировать один и тот же код. Почему ошибка, когда я советую это?
(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))
add-function
(поверх которого был перереализован механизм советов) для этого:(add-function :around isearch-search-fun-function (lambda (default) (if my-isearch-p (if isearch-forward #'my-isearch-str-forward #'my-isearch-str-backward) (funcall default))))
. 05.05.2013