我想定义一个用预定义的regexp来初始化isearch-forward-regexp的命令。
假设我想找出所有出现"aaa“或"bbb”的地方。我可以与isearch-forward-regexp交互输入的正则表达式是\\(aaa\\|bbb\\)
有什么方法可以在不以交互方式输入regexp的情况下完成此操作?我尝试过这样的东西:
(defun my-search ()
(interactive)
(isearch-mode t t)
(isearch-yank-string "\\(aaa\\|bbb\\)"))但是这种方法似乎行不通,因为似乎没有任何方法可以在emacs中定义一个字符串,当它被拖入isearch时,它的计算结果是\\(aaa\\|bbb\\)。
例如,"\\(aaa"的计算结果为(aaa,但"\\\\(aaa"的计算结果为\\\\(aaa。似乎没有一种方法可以计算出单个反斜杠。
有没有办法做我想做的事?
发布于 2017-10-28 12:44:13
此命令应该执行我认为您所要求的操作:
(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调用它,而不是以交互方式调用它,那么只需将所需的regexp作为字符串提供即可。例如:
(foo "\\(aaa\\|bbb\\)")请注意,isearch-yank-string执行以下操作:
(if isearch-regexp (setq string (regexp-quote string)))这就是为什么foo在调用isearch-regexp时将nil绑定到isearch-yank-string:以防止在字符串中引用regexp特殊字符。
https://stackoverflow.com/questions/46984599
复制相似问题