1

我想定义一个isearch-forward-regexp使用预定义的正则表达式启动的命令。

假设我想查找所有出现的“aaa”或“bbb”。我可以交互输入的正则表达式isearch-forward-regexp\\(aaa\\|bbb\\)

有没有办法在不交互输入正则表达式的情况下做到这一点?我试过这样的事情:

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

但是这种方法似乎不起作用,因为似乎没有任何方法可以在 emacs 中定义一个字符串,该字符串在\\(aaa\\|bbb\\)被拉入isearch.

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

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

4

1 回答 1

2

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

(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到: 以防止在字符串中引用正则表达式特殊字符。nilisearch-yank-string

于 2017-10-28T04:44:13.287 回答