我正在尝试在当前缓冲区中搜索第一个不是注释的elisp函数定义。我试过这个:
(re-search-forward "[^;] *\(defun ")
但无论如何它都符合评论。如下所示:
;; (defun test ()
答案 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 ()
中的空格实际上与[^;]
匹配。由于您有*
,因此不需要另一个空格。您可能想要使用[^;] +
。但是,您可以通过
\(?<!;;)
答案 2 :(得分:0)
这似乎对我很有效(在* scratch *中测试):
(re-search-forward "^ *\(defun " nil t) ; hit C-x C-e after that
; closing parenthesis
;; (defun hi () )
(defun hola () )