以编程方式启动交互式正则表达式搜索

时间:2017-10-27 23:09:40

标签: emacs elisp isearch

我想定义一个使用预定义的regexp启动isearch-forward-regexp的命令。

说我想找到所有出现的“aaa”或“bbb”。我可以使用isearch-forward-regexp以交互方式输入的正则表达式是\\(aaa\\|bbb\\)

如果没有以交互方式进入正则表达式,有没有办法做到这一点?我尝试过这样的事情:

(defun my-search ()
(interactive)
(isearch-mode t t)
(isearch-yank-string "\\(aaa\\|bbb\\)"))

但这种方法似乎不起作用,因为似乎没有任何方法可以在抓取\\(aaa\\|bbb\\)时评估为isearch的emacs中定义字符串。

例如"\\(aaa"评估为(aaa,但"\\\\(aaa"评估为\\\\(aaa。似乎没有办法评估单个反斜杠。

有没有办法做我想做的事?

1 个答案:

答案 0 :(得分:1)

这个命令应该按我认为你要求的那样做:

(defun foo (regexp) 
  (interactive (list (read-regexp "Regexp: ")))
  (isearch-mode t t)
  (let ((isearch-regexp  nil))
    (isearch-yank-string regexp)))

例如:M-x foo RET,然后输入\(aaa\|bbb\) RET

如果您从Lisp而不是以交互方式调用它,那么只需提供您想要的正则表达式作为字符串。例如:

(foo "\\(aaa\\|bbb\\)")

请注意isearch-yank-string执行此操作:

(if isearch-regexp (setq string (regexp-quote string)))

这就是为什么foo在调用isearch-regexp时将nil绑定到isearch-yank-string的原因:阻止在字符串中引用regexp特殊字符。