2010-12-01 190 views
4

我在文件一堆C宏的,这样的东西NEXT(pL)其扩展到((pL) -> next)Emacs的正则​​表达式组正则表达式替换

我想,因为他们不需要除去其中的大多数。

我想要做的是获取宏中括号内的文字pL。我希望替换正则表达式使用该文本进行重写。例如,在Perl我可以做类似/NEXT\(\s*(.+)\s*)(可能有点不正确的),然后输出类似$1->next,应转线

if (NEXT(pL) != NULL) { 

if (pL->next != NULL) { 

在Emacs中,我会喜欢在逐个文件的基础上在emacs replace-regexp中使用匹配组。我不完全确定如何在Emacs中做到这一点。

+0

可以使用“M-x c-宏扩展”或“M-x c-宏扩展”。但是你所要求的看起来将需要一个围绕“M-x c-macro-expansion”的新函数来处理整个文件或缓冲区。 – vpit3833 2010-12-01 21:32:11

+0

c-macro-expand虽然不知道宏吗?它们位于单独的文件/缓冲区中。 – Kizaru 2010-12-01 21:37:16

回答

12
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"))) 

,并为此应用到多个文件,可以在Dired and type Q to do a query-replace-regexp on all the marked files标记文件(使用正则表达式/替换在这个答案的第一行)。