首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >isearch-search-fun default的默认建议错误

isearch-search-fun default的默认建议错误
EN

Stack Overflow用户
提问于 2013-05-02 16:16:09
回答 1查看 149关注 0票数 0

这是我上一篇文章(is it possible to preprocess the input string before isearch-forward in Emacs)的续篇。我正在尝试使用变量isearch-search-fun-function来实现jpkotta的答案,而不是编写我自己的函数,我只是建议isearch-search-fun-default包含我自己的函数(isearch-str-forwardisearch-str-backward,只是为了演示的目的),这样每次我输入"abc“时,isearch都会突出显示并搜索正则表达式a[ ]*b[ ]*c[ ]*

问题是,当我建议函数然后搜索"abc“时,它给出了I-search: abc [(void-function nil)]的错误。但是如果我把我的defadvise中的代码放到原来的isearch-search-fun-default函数中,它就能工作了!所以我很困惑。Elisp手册说,ad-do-it只是原始函数代码的占位符,所以这两种方法,建议函数或更改原始函数,最终都应该生成相同的代码。当我建议的时候,为什么会出错呢?

代码语言:javascript
复制
(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))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-03 07:51:29

我不完全确定为什么会出现这些错误(我的猜测是您可能需要使用ad-return-value),但为什么要使用建议?通常,这应该是最后的手段,在这种情况下,很容易避免建议。

另外,不要在函数名前加上"isearch“前缀。由于lisp2只有一个名称空间(我不是在谈论lisp1与emacs ),因此最好对变量和函数进行唯一命名。就我个人而言,我使用了前缀"jpk/",但在这里我使用了"my-“。

代码语言:javascript
复制
(defun my-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 my-isearch-str-forward (str &optional bound noerror)
  "Search forward for STR."
  (let ((string (my-isearch-mangle-str str)))
    (re-search-forward string bound noerror)))

(defun my-isearch-str-backward (str &optional bound noerror)
  "Search backward for STR."
  (let ((string (my-isearch-mangle-str str)))
    (re-search-backward string bound noerror)))

(defvar my-isearch-p t)

(defun my-isearch-search-fun ()
  (if my-isearch-p
      (if isearch-forward 'my-isearch-str-forward 'my-isearch-str-backward)
    (isearch-search-fun-default)))

(setq isearch-search-fun-function 'my-isearch-search-fun)

另外,我不确定你到底想要什么,但它看起来和我的flex-isearch包很相似。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16333324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档