2010-12-01 228 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標記文件(使用正則表達式/替換在這個答案的第一行)。