正则表达式在Emacs中搜索不以分号开头的行

时间:2014-01-02 21:03:48

标签: regex emacs elisp

我正在尝试在当前缓冲区中搜索第一个不是注释的elisp函数定义。我试过这个:

(re-search-forward "[^;] *\(defun ")

但无论如何它都符合评论。如下所示:

;; (defun test ()

3 个答案:

答案 0 :(得分:4)

您可以使用:

 (catch 'found
  (let (match)
    (while (setq match (search-forward "(defun "))
      (when (null (syntax-ppss-context (syntax-ppss)))
        (throw 'found match)))
    nil))

它依赖于内部解析器和语言语法定义。如果point不在注释中而不在字符串中,则仅返回search-forward的结果。 如果您不喜欢在没有命中的搜索情况下的错误,则可以将nil t添加到search-forward命令的参数中。使用re-search-forward搜索也没问题。

这也适用于以下情况:

(defun test (args)
  "This function is defined with (defun test (args) ...)"
  )

答案 1 :(得分:3)

(defun test ()中的空格实际上与[^;]匹配。由于您有*,因此不需要另一个空格。您可能想要使用[^;] +。但是,您可以通过

使用负面的lookbehind
\(?<!;;)

答案 2 :(得分:0)

这似乎对我很有效(在* scratch *中测试):

(re-search-forward "^ *\(defun " nil t) ; hit C-x C-e after that
                                        ; closing parenthesis

;; (defun hi () )
(defun hola () )