regex replace中的Emacs regexp组

regex replace中的Emacs regexp组,regex,emacs,elisp,Regex,Emacs,Elisp,我在文件中有很多C宏,比如NEXT(pL),它被扩展为((pL)->NEXT) 我想去掉大部分,因为它们是不必要的 我想做的是获取宏中括号内的文本,pL。我希望替换regexp使用该文本进行重写。例如,在Perl中,我可以执行类似于/NEXT\(\s*(.+)\s*)(可能有点不正确)的操作,然后输出类似于$1->NEXT的内容,这应该是一个转折点 if ( NEXT( pL ) != NULL ) { 进入 在Emacs中,我希望在Emacs replace regexp中逐个文件地使用匹

我在文件中有很多C宏,比如
NEXT(pL)
,它被扩展为
((pL)->NEXT)

我想去掉大部分,因为它们是不必要的

我想做的是获取宏中括号内的文本,
pL
。我希望替换regexp使用该文本进行重写。例如,在Perl中,我可以执行类似于
/NEXT\(\s*(.+)\s*)
(可能有点不正确)的操作,然后输出类似于
$1->NEXT
的内容,这应该是一个转折点

if ( NEXT( pL ) != NULL ) { 
进入

在Emacs中,我希望在Emacs replace regexp中逐个文件地使用匹配组。我不完全确定如何在Emacs中实现这一点

M-x query-replace-regexp NEXT(\([^)]+\)) RET \1->next RET
这可以在这样的函数中完成(应用于整个缓冲区)

(定义展开下一步()
“交互式”
(转到字符(最小点))
(同时(向前搜索“\\next”))

而且,要将其应用于多个文件,您可以在中标记文件(使用此答案第一行中的regexp/replacement)。

可以使用
M-x c-macro-expand
M-x c-macro-expand
。但是您所要求的似乎需要在
M-x c-macro-expansion
周围使用一个新函数来处理整个文件或缓冲区。但是c-macro-expans不知道宏?它们位于一个单独的文件/缓冲区中。我感谢您的回答。我也从emacs IRC频道得到了一个非常有用的答案。我在这里清理一些旧的垃圾,而不是提交一个新的问题,因为这是正确的主题。。。我使用的是Emacs23.1。当我使用\1作为替换时,我得到“找不到匹配项”。我使用从regexp builder生成的相同regexp,该regexp与找到的文本正确匹配。有什么想法吗??
M-x query-replace-regexp NEXT(\([^)]+\)) RET \1->next RET
(defun expand-next ()
  "interactive"
  (goto-char (point-min))
  (while (re-search-forward "\\<NEXT(\\([^\)]+\\))" nil t)
    (replace-match "\\1->next")))