我想定义一个使用预定义的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
。似乎没有办法评估单个反斜杠。
有没有办法做我想做的事?
答案 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特殊字符。