【问题标题】:Initiating interactive regexp search programmatically以编程方式启动交互式正则表达式搜索
【发布时间】:2017-10-27 23:09:40
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: emacs isearch


    【解决方案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-yank-string 周围将isearch-regexp 绑定到nil:以防止在字符串中引用正则表达式特殊字符。

    【讨论】:

    • 它似乎对我不起作用。当我运行 (foo "\\(aaa\\|bbb\\)") 它搜索正则表达式的文字字符串,而不是正则表达式的含义。例如,“aaa”不匹配,但出现在函数代码中的正则表达式字符串匹配。它适用于您的 emacs 吗?
    • 是的,它在我的 Emacs 中运行良好 - 从 Emacs 20 到最新的 Emacs 26.1 预测试的所有 Emacs 版本。确保包含isearch-regexp 的 let-binding,否则行为将是您所描述的。那是因为isearch-yank-string 如果它认为你在进行正则表达式搜索,它会引用正则表达式特殊字符。使用emacs -Q(无初始化文件)进行测试。一旦开始,您可能需要使用C-s 重复搜索。
    • 莫名其妙地,它在我重新启动 emacs 后开始工作,即使加载了我的 .emacs。也许我在摆弄函数时无意中将emacs置于一种特殊状态。谢谢。
    • 如果您认为可以接受,请考虑接受答案。 (如果您以后得到更好的答案,您可以随时更改已接受的答案。)
    • 当我试图让实际的命令工作时,我遇到了问题。最初,isearch 没有找到任何东西。当我第二次按 Ctrl-s 时,它会找到出现的位置,但会在回溯到文件开头的包装搜索中找到。目前我已经放弃了,开始探索 Atom,它似乎拥有更强大和更现代的设计。
    猜你喜欢
    • 2010-10-05
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2014-06-02
    • 2023-04-10
    相关资源
    最近更新 更多